我对属性的使用有些怀疑。通过阅读ARC转换文档,应该使用strong和weak来代替retain和assign。
然而,至少有两种情况,其中Xcode自动生成的代码正在做其他事情。我想知道这是否只是来自Xcode的“仍未更新”的工具,或者我是否遗漏了某些内容。
第一种情况是使用Core Data托管对象自动生成。
创建相关类后,这就是.h文件中出现的内容:
@property(nonatomic,retain) NSString *myProperty;
在这种情况下编译器在做什么?将retain
替换为strong
?
但最奇怪的情况(因为我缺乏知识)是IBOutlet
,将Interface Builder插件与.h文件连接时自动生成的代码是:
@property (unsafe_unretained, nonatomic) IBOutlet UILabel *myOutlet;
并且这似乎与推荐的'弱'属性不同。我的意思是用户在各种论坛上推荐。
这已添加到viewDidUnload:
- (void)viewDidUnload {
[self setMyOutlet:nil];
}
为什么我们需要这个陈述?即使通过运行探查器工具,也没有内存泄漏或其他内存问题的痕迹?我的意思是,如果没有设置nil
,一切正常。
答案 0 :(得分:1)
unsafe_unretained
将存储不安全的指针,即当你的标签消失时指针仍会存在,但它会指向一些垃圾。这就是-viewDidUnload
代码在那时将指针重置为nil
的原因。当指向的对象消失时,使用weak
属性会自动将指针值转换为nil
。这就是推荐它的原因。
retain
和strong
基本相同。该对象被保留,即在该属性设置为另一个值(例如nil
)之前不会消失,此时该对象被释放。