什么是目标C中的dealloc

时间:2010-07-16 06:17:24

标签: objective-c

我想问一个关于目标C的一般性问题。当我编写iPhone应用程序的程序时,我总是在.m中看到一个名为'dealloc'的函数。什么时候会调用这个方法?我是否需要将所有[发布]放在这里对应用程序有用?非常感谢你。

// ------------------更新内容-------------------------

NSArray *arr;
NSString *str;
NSMutableArray *mutableArr;

// in the dealloc
// it should have to following
[arr release];
[str release];
[mutableArr release];

该功能将被调用3次?

4 个答案:

答案 0 :(得分:13)

当对象的保留计数达到零时,会调用dealloc方法。每次retain通话的保留计数增加1,每次release通话减少一次。当前NSAutoreleasePool耗尽时,autorelease会调度未来的release调用,通常是在事件周期结束时,但您可以在内存密集型操作上设置自己的NSAutoreleasePools。 (有关详细信息,请参阅NSAutoreleasePool文档。)

你应该把什么放入dealloc?您应该为该类的对象保留的每个成员对象放置一个版本。

有些事情会让事情变得更容易。 nil对象将静静地忽略发送给它的任何消息,因此当foo = nil时[foo release]不是bug。但是,两次释放对象可能会导致严重问题。我的(几乎不是唯一的)解决方案就是在我发布它时明确地将我刚发布的内容设置为nil。事实上,我将nil赋值放在与发布相同的行上,这样我就可以找到“发布”并找到我错过的地方。例如:

@interface MyClass {
    Foo *foo;
    Bar *bar;
    NSInteger baz;
}
-(void)dealloc;
@end

@implementation MyClass
-(void)dealloc {
    [foo release]; foo = nil;
    [bar release]; bar = nil;
    [super dealloc];
}
@end

我将nil分配给变量,即使该变量即将超出范围该对象即将消失。为什么?如果同一个类的另一个对象在我发布之后分配在同一个内存空间中,它保证不会有新对象可能意外使用的悬空指针,并使调试成为一场噩梦。 (另请参阅NSZombieEnabled以获取调试帮助。)

答案 1 :(得分:5)

  

何时调用此方法?

当该对象的引用计数变为0时调用它,因为它的所有指针都已释放。它占用的内存被释放(释放);对象本身就被破坏了。

  

我是否需要将所有[发布]放在这里对应用程序有用?

是,释放仍保留的对象的所有属性。

编辑:为响应您的更新问题,您的自定义对象中的dealloc仅被调用一次。然后它会发送这三条消息:

[arr release];
[str release];
[mutableArr release];

三个对象中的每一个。它们完全不同的对象,但是如果每个只有一个实例,则它们的引用计数全部下降到0并且它们的 dealloc方法会自动调用

答案 2 :(得分:1)

正如你猜测的那样,当一个物体被摧毁时就会被召唤出来。该对象应该释放它拥有的一切。

答案 3 :(得分:0)

换句话说,Dealloc释放/销毁/释放分配给对象的内存。 一旦不使用,就应销毁已分配给内存的对象,以避免可能导致应用程序崩溃的内存泄漏。

ZaldzBugz