当你在 Objective-C 中释放一个对象时(假设它的释放计数为 1),它的释放计数减为 0 并且调用了 dealloc 方法。对象是在 [super dealloc] 之后立即销毁,还是添加到池中并在池耗尽时销毁?
我假设释放的对象在 dealloc 结束时被销毁(当调用 [super dealloc] 时)我知道自动释放变量被添加到池中,只是想确定正常释放的对象会发生什么。
干杯-加里-
当你在 Objective-C 中释放一个对象时(假设它的释放计数为 1),它的释放计数减为 0 并且调用了 dealloc 方法。对象是在 [super dealloc] 之后立即销毁,还是添加到池中并在池耗尽时销毁?
我假设释放的对象在 dealloc 结束时被销毁(当调用 [super dealloc] 时)我知道自动释放变量被添加到池中,只是想确定正常释放的对象会发生什么。
干杯-加里-
首先,Objective-C编程语言没有任何内存管理的概念。内存管理内置于 Foundation (Mac OS X 上的 Cocoa 和 iPhone OS 上的 Cocoa Touch 的通用框架)。Foundation 添加了一个根类 NSObject,它在 Objective-C 运行时的和函数之上实现、和作为便利包装alloc
器。retain
release
autorelease
class_createInstance()
object_dispose()
由于 Objective-C 与内存管理无关,因此添加垃圾收集并在NSObject
无操作上创建所有内存管理方法非常容易。但是在 iPhone OS 和旧版 Mac OS X 上没有垃圾收集,我们在 Cocoa 中使用了引用计数方案。
在 Foundation 上或从 Foundation调用alloc
类方法时会创建一个对象。这些默认实现将调用,因此您无需手动操作。NSObject
NSProxy
class_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
它拥有的所有对象,并且任何不再被其他任何对象拥有的对象都会被释放。
是的,一旦保留计数达到零,它们就会被释放。
自动释放系统适用于所有权有点“模糊”的对象 - 即,当您返回一个您不想拥有的新对象时,其生命周期未知,并且您不想假设调用者会占用负责。当自动释放池耗尽时(通常是下一次运行循环),所有成员都被发送释放。如果收到你的对象的调用者想要对它负责,它所要做的就是保留它,这将避免它的释放。