2 developerwab developerWab 于 2013.04.27 14:33 提问

为什么retain属性在objeC中不一定保存?

下面的代码崩溃了,但是注释没有崩溃:

@property (retain) NSDate *lastCurrentDate;
...
@synthesize lastCurrentDate;
- (void)viewWillAppear:(BOOL)animated {
    BOOL crash = [lastCurrentDate isEqualToDate:[NSDate date]]);
}
- (void)viewDidDisappear:(BOOL)animated {
    //lastCurrentDate = [[NSDate date] retain];
    lastCurrentDate = [NSDate date];
}

为什么retain属性在objectiveC中不一定保留?

1个回答

KindAzrael
KindAzrael   2013.04.27 23:26
已采纳

很简单 因为 你对lastCurrentDate的付值操作是这样的 lastCurrentDate = otherDate;
这样就是直接把otherDate assign给了 lastCurrentDate, 他们2个指向统一个Date 但是retainCount确为1
所以otherDate调用release了 lastCurrentDate就指向了一个dealloc对象 在对lastCurrentDate操作就crash了

既然你是用非ARC 而且@property (retain) NSDate *lastCurrentDate retain 声明了lastCurrentDate
你因该在类里面这样使用lastCurrentDate self.lastCurrentDate = otherDate;
这样就会去调用 setLastCurrentDate 方法来retain住对象 这样就不会crash

真确代码:

@property (retain) NSDate *lastCurrentDate;
...
@synthesize lastCurrentDate;
- (void)viewWillAppear:(BOOL)animated {
    BOOL crash = [self.lastCurrentDate isEqualToDate:[NSDate date]]);
}
- (void)viewDidDisappear:(BOOL)animated {
    //lastCurrentDate = [[NSDate date] retain];
    self.lastCurrentDate = [NSDate date];
}
developerWab
developerWab 非常感谢提供这么详细的回答。
接近 5 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!