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;
}