fuz*_*oat 3 memory pool objective-c dealloc
当你在Objective-C中释放一个对象时(假设它的释放计数为1),它的释放计数减少到0并调用dealloc方法.对象是在那里被破坏然后在[super dealloc]之后被破坏了,还是被添加到池中并在池被耗尽时被销毁?
我假设释放的对象在dealloc结束时被销毁(当调用[super dealloc]时)我知道自动释放变量被添加到池中,只是想确定正常释放对象会发生什么.
干杯 - 加里 -
首先,Objective-C 编程语言没有任何内存管理的概念.内存管理内置于Foundation (Mac OS X的Cocoa和iPhone OS上的Cocoa Touch的通用框架).基金会增加了rootclass NSObject的实现alloc
,retain
,release
和autorelease
作为顶部方便的包装class_createInstance()
和object_dispose()
功能从Objective-C的运行时间.
由于Objective-C与内存管理无关,因此添加垃圾收集并在NSObject
no-ops 上制作所有内存管理方法非常简单.但是在iPhone OS和传统Mac OS X上没有垃圾收集,我们在Cocoa中使用引用计数方案.
alloc
在Foundation 上NSObject
或NSProxy
从Foundation 调用类方法时创建对象.这些默认实现将调用,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;
}
Run Code Online (Sandbox Code Playgroud)
调用autorelease
不会减少保留计数,它只会将对象的所有权从调用者转移到当前的自动释放池.稍后当前自动释放池消失时,它将调用release
它拥有的所有对象,并且释放任何不再拥有的任何对象.
是的,一旦保留计数达到零,它们就会被释放.
自动释放系统适用于所有权有点"模棱两可"的对象 - 即,当您返回一个您不想拥有的新对象时,其生命周期未知,并且您不想假设调用者将采取责任.当自动释放池耗尽时(通常在运行循环的下一次),所有成员都被释放.如果收到您的对象的调用者想要对其负责,那么它所需要做的只是保留它,这将避免它的释放.
归档时间: |
|
查看次数: |
1794 次 |
最近记录: |