对dealloc电话的困惑

时间:2012-02-21 14:31:03

标签: objective-c cocoa dealloc

我在这里有一个基本问题。

我知道当对象的引用计数变为零时将调用dealloc,并且dealloc释放对象持有的所有资源或释放内存,对吗?

如果我们向该对象发送释放消息,对象引用计数为零?

让我们考虑以下对象及其属性创建为

@property (retain) NSString* myString;//reference count 1

和dealloc

[myString release];//reference count 0
[super dealloc];

除了dealloc之外,我没有释放myString对象。

我的问题是谁将myString对象引用计数设为零,以便调用dealloc?

请澄清我的疑问。

3 个答案:

答案 0 :(得分:2)

维护对象所有权的任何东西都有责任释放它。例如,如果您发布的代码是维护NSString中存储的myString所有权的唯一内容,那么当您调用release时,引用计数将减少,并且该对象可能会被释放(String literals is不同)。现在,如果您通过myString或其他请求myString并保留它,那么该代码也负责释放它,这可能是在您在dealloc方法中释放它之前或之后。

我建议参考documentation来强化这个概念。

答案 1 :(得分:1)

假设你的属性myString在你的MyClass类中。您的类的每个实例都已创建并且(可能!)已发布。当该实例被[释放]时,调用MyClass的dealloc方法。你的dealloc反过来调用你的属性上的释放,然后调用它们的dealloc,依此类推,直到你使用对象到达这个对象堆栈的“底部”。

答案 2 :(得分:0)

如果保留/释放对匹配,您的对象将被释放。如果你遵循可可内存管理(参见apple docs - advance memory management programming guide) 规则,你是那个时候唯一的'所有者' - 并且运行dealloc zap是最后一个参考 - 免费提供对象。