为什么IBOutlet保留计数为2

时间:2011-03-18 10:47:38

标签: iphone cocoa-touch

为什么IBOutlet保留计数为2而不仅仅是1 ??

有什么区别
IBOutlet UILabel *fooLabel;

UILabel *fooLabel;


@property (nonatomic, retain) IBOutlet UILabel *fooLabel; 

4 个答案:

答案 0 :(得分:2)

  

为什么IBOutlet保留计数为2而不仅仅是1?

你不在乎。不,老实说,你不是。这正是人们会告诉你不要担心保留计数的原因。你无法保证它会是你期望的任何特定数字。保留计数是Cocoa内部实现细节。如果框架想要它,甚至UINT_MAX,它没有理由不应该是100。

  

有什么区别
IBOutlet UILabel *fooLabel;
  

UILabel *fooLabel;

@property (nonatomic, retain) IBOutlet UILabel *fooLabel;

第一个声明一个可以充当插座的实例变量。第二个声明可以作为出口的财产。加载NIB时,在第一种情况下,指针直接分配给实例变量,在第二种情况下,访问器用于分配实例变量。

答案 1 :(得分:2)

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

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

  3. 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中释放它。