[英]Do I need release in the dealloc?
在我正在研究iPhone开发的书中,他们使用Interface Builder来使用IBOutlet
实例。 一个例子是UIButton
。 所以他们在结构中添加了这样的东西:
IBOutlet UIButton *whateverButton;
然后,他们添加一个@property
对于这些在.h和一个@synthesize
在.M。
然后他们在.m的dealloc
中包含一个release
。 两个问题:
属性不是“自动处理”。 最接近的是合成访问器正确处理其内存管理职责。 但那只是那些访问者。 属性只是在课堂上声明可访问的“事物”的一种方式。 除此之外,他们没有得到太多特殊待遇。 它没有打开某种垃圾收集。 所以是的,发布是必要的。
如果要检查正在运行的应用程序是否存在泄漏或未释放的内存,您应该使用像Instruments这样的调试工具。 我不会直接查看引用计数,因为它几乎是危险无用的 - 不能保证引用计数在任何时候都是你所期望的,并不一定表明存在问题。
你应该阅读Apple的Cocoa内存管理规则 。 一旦你吸收了它,这很简单。 我不一定会建议首先阅读其他指南,因为细微的错误陈述可能会导致你走错路(例如,为你释放属性的想法可能来自于听到有人错误地说明它们是如何工作的)。
是否需要发布? 是不是所有属性都已自动处理?
如果保留该属性,则必须释放。 当你声明一个@property
和@synthesize
它时,你得到的就是访问器,dealloc中没有特殊的自动行为。
此外,IBOutlet没有任何神奇之处 - 它只是Interface Builder的标记,可以查看您希望在IB中显示哪些属性。 它只是一个空的宏,Cmd-单击IBOutlet关键字以查看其定义:
#ifndef IBOutlet
#define IBOutlet
#endif
同样的事情也适用于IBAction,它扩展到void
。
为了调试目的,我如何检查引用计数以查看发生了什么?
当我需要调试内存管理时,我通常只是在dealloc方法中设置一个断点或在那里记录一个字符串。 将一个对象的retainCount
记录在可能与它有关的调用周围也很有帮助。
查看@synthesize
指令如何创建访问器也可能有所帮助。 当你声明一个保留的@property
并要求编译器@synthesize
它们时,你会得到这样的结果:
@property(retain) NSString *foo;
@synthesize foo;
- (void) foo {
return foo;
}
- (void) setFoo: (NSString*) newFoo {
// Try to think what would happen if this condition wasn’t
// here and somebody called [anObject setFoo:anObject.foo].
if (newFoo == foo)
return;
[foo release];
foo = [newFoo retain];
}
这不完全是事情,但它足够接近。 现在应该更清楚为什么你应该释放dealloc。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.