开发者社区 问答 正文

请问为何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中不一定保留?

展开
收起
爵霸 2016-03-23 10:53:33 2090 分享 版权
1 条回答
写回答
取消 提交回答
  • 很简单 因为 你对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];
    }
    2019-07-17 19:10:31
    赞同 展开评论
问答地址: