为什么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中不一定保留?

很简单 因为 你对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];
}