iPhone开发问题~就是随手一记

1.归档一个单实例对象时要在initWithCoder里retain一下。不然它会在我不知道的情况下被释放。原因不明。请高人指点。
2.开发过程中的流程最好要有成功失败的返回值,并打出LOG方便快速查找问题。
if(![self doSomeThing]){
 

    NSLog{~~~~[self doSomeThing]~~~return NO~~~~};
      return ;
}
3.当有通知(NSNotificationCenter)貌似不收不到时,尝试将被通知后要执行的函数延迟0.01秒,尤其是通知和界面推出动画在一起时。有问题。延迟一下,再试试。
4.写一个规范的安全的单实例:
static MyClass *sigleInstance = nil;
+ (id)shareInstance {
      @synchronized(self) {
              if (sigleInstance == nil) {
                      sigleInstance = [[self alloc] init];
              }
      }
      return sigleInstance;
}
- (id)init
{
      if (self = [super init])
      {
            self.string1 = [NSString string];
            self.string2 = [NSString string];

      }
      return self;
}
+ (id)allocWithZone:(NSZone *)zone {
      @synchronized(self) {
              if (sigleInstance == nil) {
                      sigleInstance = [super allocWithZone:zone];
                      return sigleInstance;
              }
      }
      return nil;
}

+ (id)copyWithZone:(NSZone *)zone {
      return self;
}

- (id)retain {
      return self;
}

- (unsigned)retainCount {
      return UINT_MAX;
}

- (void)release {
}

- (id)autorelease {
      return self;
}
- (void)dealloc
{
      [string1 release];
      [string2 release];
      [super dealloc];
}


#pragma mark 
#pragma mark  NSCoder归档
-(void)encodeWithCoder: (NSCoder *)encoder
{
      [encoder encodeObject:self.string1 forKey: @"string1"] ;            
      [encoder encodeObject:self.string2 forKey: @"string2"] ;            
}

-(id)initWithCoder: (NSCoder *)decoder
{
      MyClass * sigleInstance =  [[MyClass shareInstance] retain] ;
      sigleInstance.string1 = [decoder decodeObjectForKey:@"string1"];
      sigleInstance.string2 = [decoder decodeObjectForKey:@"string2"];
      return sigleInstance;
}

你可能感兴趣的:(移动开发,职场,休闲,重要)