繁体   English   中英

为什么IBOutlet保留计数为2

[英]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时,在第一种情况下,将指针直接分配给实例变量,在第二种情况下,将使用访问器分配实例变量。

  1. 绝对保留计数值与您自己的内存管理惯例无关。 不要依靠它来诊断内存管理问题。 您应该查看Apple的文档- 此处链接

  2. 关于第二个问题,这里是快速概述

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)不要使用retainCountretainCount对象的“保留状态”- 何时使用-retainCount?

2)在这两种情况下,都将由于KVC而保留出口对象(在第一种情况下,它是“魔术”)。 这意味着在两种情况下,您都必须在使用dealloc其释放(例如,在dealloc )。

3)保证第二个代码段可以按预期工作,而第一个代码段的行为看起来像是依赖于我的实现(我找不到关于非属性ivars的有关KVC的清晰文档)。

仔细检查您的代码是否明确保留了标签([fooLabel keep])。 如果没有,则不要释放它两次。 仅在dealloc中释放它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM