我需要在dealloc中释放吗?

Dan*_*ark 3 iphone objective-c

在我正在为iPhone开发人员学习的书中,他们使用IBOutletInterface Builder来利用实例.一个例子是a UIButton.所以他们在结构中添加了这样的东西:

 IBOutlet UIButton *whateverButton;
Run Code Online (Sandbox Code Playgroud)

然后他们@property在.h中为每一个添加一个,@synthesize在.m中添加一个.

然后,他们包括releasedealloc该.M的.两个问题:

  1. 是否需要发布?是不是所有属性都已自动处理?
  2. 为了调试目的,我如何检查引用计数以查看发生了什么?

Chu*_*uck 5

属性不是"自动处理".最接近的是合成访问器正确处理其内存管理职责.但那只是那些访问者.属性只是在课堂上声明可访问的"事物"的一种方式.除此之外,他们没有得到太多特殊待遇.它没有打开某种垃圾收集.所以是的,发布是必要的.

如果要检查正在运行的应用程序是否存在泄漏或未释放的内存,您应该使用像Instruments这样的调试工具.我不会直接查看引用计数,因为它几乎是危险无用的 - 不能保证引用计数在任何时候都是你所期望的,并不一定表明存在问题.

你应该阅读Apple的Cocoa内存管理规则.一旦你吸收了它,这很简单.我不一定会建议先阅读其他指南,因为细微的错误陈述可能会导致你走错路(例如,为你释放属性的想法可能来自于听到有人错误地说明它们是如何工作的).


zou*_*oul 5

是否需要发布?是不是所有属性都已自动处理?

如果保留该属性,则必须释放.当你声明a @property@synthesize它时,你得到的只是访问器,dealloc中没有特殊的自动行为.

此外,IBOutlet没有任何神奇之处 - 它只是Interface Builder的标记,可以查看您希望在IB中显示哪些属性.它只是一个空的宏,Cmd-单击IBOutlet关键字以查看其定义:

#ifndef IBOutlet
#define IBOutlet
#endif
Run Code Online (Sandbox Code Playgroud)

对于扩展到的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];
}
Run Code Online (Sandbox Code Playgroud)

这不完全是事情,但它足够接近.现在应该更清楚为什么你应该释放dealloc.