Sam*_*Sam 6 cocoa-touch memory-management objective-c iboutlet
在我继承的代码中,我看到了以下内容:
@property (readonly) IBOutlet UIImageView * bgImage;
Run Code Online (Sandbox Code Playgroud)
当我期望保留记忆模型如:
@property (readonly, retain) IBOutlet UIImageView * bgImage;
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么第一个属性定义工作而不会引起问题.
此外,还有一个releasedealloc,如你所料:
-(void)dealloc
{
[_bgImage release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
如果有人能为此提出解释,我将不胜感激.我已经与原始开发人员交谈,他试图编写更简洁的代码,这就是为什么他retain在内存模型中遗漏了(似乎没必要).
我想知道IBOutlet是否基本上被视为ivar IBOutlet语句,因为它只是readonly(没有使用setter,因此默认的assign memory模型没有区别).
如果永远不会期望IBOutlet发生变化,那么使用没有内存模型的readonly属性实际上是定义属性的更好方法吗?
iOS上的nib加载器在nib中创建对象,然后自动释放它们.当它建立与出口的连接时,它会使用setValue:forKey:,它将调用该密钥的setter方法.如果没有设定器被定义,例如当IBOutlet是一个readonly属性,所述对象被保持反正被分配之前.(这是在资源编程指南中管理iOS中的Nib对象的一种解释.)
因此实际上,无论出口是否被声明为,retain或者assign另一端的物体是由具有出口的物体所拥有的.它可以通过setter方法保留,也可以setValue:forKey:在找不到setter时保留.由于在第二种情况下没有其他可能的所有者,您可以将具有插座的对象视为所有者.因此,应该释放笔尖中的对象dealloc.
我同意你的看法,应该通过更改属性属性来明确这个内存条件retain.*是否它readonly似乎没有区别(但是,见下文).从概念上讲,是的,该对象是只读的,因此是否明确地将其标记为取决于您是否认为它是适当记录的事实是它是一个IBOutlet.
更新:Paul.s的评论下面促使我做了一个快速测试.我创建了一个UIView,它记录它的子类alloc,retain,release,和autorelease电话,坚持它的一个实例到笔尖,并给应用程序的委托一个IBOutlet通过属性.
手动计算引用计数活动时,该实例在属性为0时计数为净0 (readwrite, assign).这是净+1当财产被宣布推荐的方式,(readwrite, retain)和也当它是(readonly, assign).所有这些都与预期的一样 - 当它是时(readwrite, assign),分配设置器用于建立连接,并且不进行保留.如果是readonly,连接机制会依赖于自己的保留.
最有趣的是,当我尝试使用声明的属性更改此视图的背景颜色来崩溃应用程序(readwrite, assign)时(即,当它可能已被释放时),我看到最后一个retain弹出的调用.
我认为这归结为:遵循Apple的建议 - 他们知道幕后发生了什么,并且(除了错误)不会引导你错.
(另外一件事就是,一如既往,担心绝对引用计数并不会非常有用 - 计数在一次点上一直上升到6,在二十几次调用retain和release-你只需要担心你直接造成的保留和释放.)
*当然,这在ARC下有所改变.我转述的信息在其章节的"遗产模式"部分.根据ARC的建议是IBOutlets要weak除非它们是顶层,在这种情况下,他们应该是strong.这样做意味着您依赖视图层次结构(保留其子视图的视图)来维护自己.
| 归档时间: |
|
| 查看次数: |
1394 次 |
| 最近记录: |