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