[英]Why IBOutlet retain count is 2
为什么IBOutlet保留数是2而不仅仅是1?
和之间有什么区别
IBOutlet UILabel *fooLabel;
和
UILabel *fooLabel;
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
为什么IBOutlet保留计数是2而不是1?
你不在乎 不,说实话,你没有。 这就是为什么人们会告诉您不要担心保留数的原因。 您永远不能保证它会是您期望的任何特定数字。 保留计数是可可内部实施的详细信息。 如果框架希望将其设置为100,甚至没有理由,则没有理由不设置UINT_MAX
。
和之间有什么区别
IBOutlet UILabel *fooLabel;
和
UILabel *fooLabel;
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
第一个声明一个实例变量,该变量可用作出口。 第二个声明一个可以充当出口的属性。 加载NIB时,在第一种情况下,将指针直接分配给实例变量,在第二种情况下,将使用访问器分配实例变量。
绝对保留计数值与您自己的内存管理惯例无关。 不要依靠它来诊断内存管理问题。 您应该查看Apple的文档- 此处链接
关于第二个问题,这里是快速概述
IBOutlet UILabel *fooLabel;
声明fooLabel变量以及Interface Builder nib文件的出口。
UILabel *fooLabel;
如上,没有Interface Builder的插座。
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
为您的nib文件声明一个属性fooLabel和一个出口。 如果使用synthesize fooLabel
合成此属性,它将为该属性创建getter和setter方法。 (retain)属性告诉合成的setter方法在释放旧值之前保留新值。
1)不要使用retainCount
来retainCount
对象的“保留状态”- 何时使用-retainCount?
2)在这两种情况下,都将由于KVC而保留出口对象(在第一种情况下,它是“魔术”)。 这意味着在两种情况下,您都必须在使用dealloc
其释放(例如,在dealloc
)。
3)保证第二个代码段可以按预期工作,而第一个代码段的行为看起来像是依赖于我的实现(我找不到关于非属性ivars的有关KVC的清晰文档)。
仔细检查您的代码是否明确保留了标签([fooLabel keep])。 如果没有,则不要释放它两次。 仅在dealloc中释放它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.