我在这里有一个基本问题。
我知道当对象的引用计数变为零时将调用dealloc,并且dealloc释放对象持有的所有资源或释放内存,对吗?
如果我们向该对象发送释放消息,对象引用计数为零?
让我们考虑以下对象及其属性创建为
@property (retain) NSString* myString;//reference count 1
和dealloc
[myString release];//reference count 0
[super dealloc];
除了dealloc之外,我没有释放myString
对象。
我的问题是谁将myString
对象引用计数设为零,以便调用dealloc?
请澄清我的疑问。
答案 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是最后一个参考 - 免费提供对象。