什么时候发布的对象最终被破坏

时间:2009-09-14 10:23:14

标签: objective-c memory pool dealloc

当你在Objective-C中释放一个对象时(假设它的释放计数为1),它的释放计数减少到0并调用dealloc方法。对象是在那里被破坏然后在[super dealloc]之后,还是被添加到池中并在池被耗尽时被销毁?

我认为释放的对象在dealloc结束时被销毁(当调用[super dealloc]时)我知道自动释放变量被添加到池中,只是想确定正常释放对象会发生什么。

欢呼 - 加里 -

2 个答案:

答案 0 :(得分:8)

首先,Objective-C 编程语言没有任何内存管理概念。内存管理内置于Foundation (Mac OS X的Cocoa和iPhone OS上的Cocoa Touch的通用框架)。 Foundation添加了一个根类NSObject,它实现了allocretainreleaseautorelease作为方便包装器,位于class_createInstance()object_dispose()函数之上。 Objective-C运行时。

由于Objective-C与内存管理无关,因此在NSObject no-ops上添加垃圾收集和制作所有内存管理方法非常简单。但是在iPhone OS和传统Mac OS X上没有垃圾收集,我们在Cocoa使用引用计数方案。

从Foundation allocNSObject调用NSProxy类方法时,会创建一个对象。这些默认实现将调用class_createInstance(),以便您永远不需要手动。

在根类dealloc上运行NSObject时,对象“死亡”。这是通过调用object_dispose()释放堆上对象的内存时,只要从Foundation中继承NSObjectNSProxy,就不需要自己调用此函数。

就运行时而言,自动释放的对象没有任何特殊处理,自动释放的对象与任何其他对象一样活着。当你autorelease一个物体时,会发生什么;

-(id)autorelease; {
  [NSAutoreleasePool addObject:self];  // retain count +1
  [self release];                      // retain count -1
  return self;
}

调用autorelease不会减少保留计数,它只会将对象的所有权从调用者转移到当前的自动释放池。稍后当前的自动释放池消失时,它会在它拥有的所有对象上调用release,并释放任何不再拥有的任何对象。

答案 1 :(得分:5)

是的,一旦保留计数达到零,它们就会被解除分配。

自动释放系统适用于所有权有点“模棱两可”的对象 - 即,当您返回一个您不想拥有的新对象时,其生命周期未知,并且您不想假设来电者将负责。当自动释放池耗尽时(通常在运行循环的下一次),所有成员都被释放。如果收到你的对象的调用者想要对它负责,那么它所需做的就是保留它,这样就可以避免它的释放。