2011-03-18 87 views

回答

2

为什么IBOutlet中保留数为2不仅仅是1之间的区别?

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

和是什么

IBOutlet UILabel *fooLabel; 

UILabel *fooLabel; 

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

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

+0

对于保留计数,我必须释放两次出口,第一次viewDiDUnload,然后在dealloc中,我真的不明白为什么? – pointeur 2011-03-18 11:11:29

+0

@指针:不,你不知道。忘记保留次数。你唯一关心的是你是否拥有这个物体。你有'分配','新','保留'或'复制'它吗?如果答案是否定的,那么你**不得**放行。 – JeremyP 2011-03-18 11:23:00

+0

我所做的只是IBOutlet UIImageView * imageView;但我不得不释放它两次,我正在开发一个iphone应用程序,这与加载nib/xib文件有关,我并不真正了解 – pointeur 2011-03-18 11:28:03

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

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

IBOutlet UILabel *fooLabel;为您Interface Builder的笔尖文件的出口沿声明一个变量fooLabel。

UILabel *fooLabel;上面没有Interface Builder的插座。

@property (nonatomic, retain) IBOutlet UILabel *fooLabel;声明属性fooLabel和您的笔尖文件的出口。如果将此属性与synthesize fooLabel合成,它将为该属性创建一个getter和setter方法。 (retain)属性告诉合成的setter方法在释放旧的值之前保留新的值。

2

1)不要使用retainCount来思考“保持状态”对象 - When to use -retainCount?

2)在这两种情况下,出口的对象会因为KVC的保留(在它的“魔力”)的第一例。这意味着,在这两种情况下,您必须在完成后释放它(例如,在dealloc中)。

3)第二个片段保证按预期工作,而第一个片段的行为看起来像实施依赖于我(我无法找到关于非属性ivars KVC的明确文档)。

0

仔细检查您的代码是否明确保留标签([fooLabel retain])。如果不是,那么不要释放它两次。只在dealloc中释放它。

+0

当声明IBOutlet UIImageView * imageView;我必须两次释放它 – pointeur 2011-03-18 11:25:14

+0

你是否用仪器检查过你的代码?有任何泄漏?如果不是不用担心。只是在dealloc中发布它。如果你释放两次,你可能会得到一个EXC_BAD_ACCESS来释放对象,所以在释放对象两次的时候要小心。 – 2011-03-18 11:40:30