通过与自动生成的代码Xcode 4进行比较来了解@property属性

时间:2012-02-18 09:33:35

标签: objective-c memory-management xcode4 iboutlet

我对属性的使用有些怀疑。通过阅读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,一切正常。

1 个答案:

答案 0 :(得分:1)

unsafe_unretained将存储不安全的指针,即当你的标签消失时指针仍会存在,但它会指向一些垃圾。这就是-viewDidUnload代码在那时将指针重置为nil的原因。当指向的对象消失时,使用weak属性会自动将指针值转换为nil。这就是推荐它的原因。

retainstrong基本相同。该对象被保留,即在该属性设置为另一个值(例如nil)之前不会消失,此时该对象被释放。