开发者社区> 问答> 正文

请问为何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 1983 0
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
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载