据我了解,任何使用alloc,new或copy创建的东西都需要手动释放.例如:
int main(void) { NSString *string; string = [[NSString alloc] init]; /* use the string */ [string release]; }
不过,我的问题是,这不是有效吗?:
int main(void) { NSAutoreleasePool *pool; pool = [[NSAutoreleasePool alloc] init]; NSString *string; string = [[[NSString alloc] init] autorelease]; /* use the string */ [pool drain]; }
kperryua.. 67
是的,你的第二个代码snippit是完全有效的.
每次--autorelease被发送到一个对象,它被添加到最里面的自动释放池.当池耗尽时,它只是向池中的所有对象发送-release.
自动释放池只是一种便利,允许您推迟发送 - 直到"以后"."稍后"可能会在几个地方发生,但Cocoa GUI应用程序中最常见的是在当前运行循环周期结束时.
是的,你的第二个代码snippit是完全有效的.
每次--autorelease被发送到一个对象,它被添加到最里面的自动释放池.当池耗尽时,它只是向池中的所有对象发送-release.
自动释放池只是一种便利,允许您推迟发送 - 直到"以后"."稍后"可能会在几个地方发生,但Cocoa GUI应用程序中最常见的是在当前运行循环周期结束时.
由于drain
并且release
似乎引起混淆的功能,这里可能值得澄清(虽然这在文档中有所涉及......).
严格地说,从大局的角度drain
是不等同于release
:
在引用计数环境中,drain
执行相同的操作release
,因此两者在这种意义上是等价的.要强调,这意味着如果您使用而不是,则不会泄漏池.drain
release
在垃圾收集环境中,release
是无操作.因此它没有效果. drain
另一方面,它包含了一个收集器的提示,它应该"在需要时收集".因此,在垃圾收集环境中,使用drain
有助于系统平衡收集扫描.
正如已经指出的那样,您的第二个代码段是正确的.
我想建议一种更简洁的方法来使用适用于所有环境的自动释放池(引用计数,GC,ARC),并避免排放/释放混淆:
int main(void) { @autoreleasepool { NSString *string; string = [[[NSString alloc] init] autorelease]; /* use the string */ } }
在上面的例子中,请注意@autoreleasepool块.这在此处记录.
不你错了.文档明确指出,在非GC下,-drain相当于-release,这意味着NSAutoreleasePool 不会被泄露.