为什么IBOutlet保留计数为2而不仅仅是1 ??
和
有什么区别IBOutlet UILabel *fooLabel;
和
UILabel *fooLabel;
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
答案 0 :(得分:2)
为什么IBOutlet保留计数为2而不仅仅是1?
你不在乎。不,老实说,你不是。这正是人们会告诉你不要担心保留计数的原因。你无法保证它会是你期望的任何特定数字。保留计数是Cocoa内部实现细节。如果框架想要它,甚至UINT_MAX
,它没有理由不应该是100。
和
有什么区别
IBOutlet UILabel *fooLabel;
和
UILabel *fooLabel;
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
第一个声明一个可以充当插座的实例变量。第二个声明可以作为出口的财产。加载NIB时,在第一种情况下,指针直接分配给实例变量,在第二种情况下,访问器用于分配实例变量。
答案 1 :(得分:2)
绝对保留计数值与您自己的内存管理实践无关。不要依赖它来诊断内存管理问题。您应该查看Apple的文档 - 链接here
关于你的第二个问题,这是一个快速概述
IBOutlet UILabel *fooLabel;
声明了一个fooLabel变量以及Interface Builder nib文件的插座。
UILabel *fooLabel;
没有Interface Builder的出口。
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
声明属性fooLabel和nib文件的出口。如果使用synthesize fooLabel
合成此属性,它将为该属性创建getter和setter方法。 (retain)属性告诉合成的setter方法在释放旧值之前保留新值。
答案 2 :(得分:2)
1)不要使用retainCount
来推断对象的“保留状态” - When to use -retainCount?
2)在这两种情况下,由于KVC(在第一种情况下它是“魔术”),将保留插座对象。这意味着在这两种情况下,你必须在完成它时释放它(例如在dealloc
中)。
3)第二个片段保证按预期工作,而第一个片段的行为看起来像依赖于我的实现(我找不到关于非属性ivars的KVC的明确文档)。
答案 3 :(得分:0)
仔细检查您的代码是否明确保留标签([fooLabel retain])。如果没有,那么不要释放两次。仅在dealloc中释放它。