下面的代码崩溃了,但是注释没有崩溃:
@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中不一定保留?
很简单 因为 你对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];
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。