3

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

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

干杯-加里-

4

2 回答 2

8

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

由于 Objective-C 与内存管理无关,因此添加垃圾收集并在NSObject无操作上创建所有内存管理方法非常容易。但是在 iPhone OS 和旧版 Mac OS X 上没有垃圾收集,我们在 Cocoa 中使用了引用计数方案。

在 Foundation 上或从 Foundation调用alloc类方法时会创建一个对象。这些默认实现将调用,因此您无需手动操作。NSObjectNSProxyclass_createInstance()

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

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

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

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

于 2009-09-14T11:19:16.593 回答
5

是的,一旦保留计数达到零,它们就会被释放。

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

于 2009-09-14T10:28:39.273 回答