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



我对属性的使用有一些疑问。通过阅读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)之前不会消失,此时对象将被释放。

最新更新