据我了解,使用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];}
3 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
是的,您的第二个代码段是完全有效的。
每次将-autorelease发送给对象时,都会将其添加到最内部的autorelease池中。当池耗尽时,它仅向池中的所有对象发送-release。
自动释放池只是一种便利,它使您可以将发送-发送推迟到“以后”。“稍后”可能会在多个地方发生,但是在Cocoa GUI应用程序中最常见的是当前运行循环周期的结尾。
慕神8447489
TA贡献1780条经验 获得超1个赞
NSAutoreleasePool:消耗与释放
由于功能drain和release似乎是造成混乱,它可能是值得澄清这里(虽然这是覆盖在文档 ...)。
严格地说,从大局的角度drain是不等同于release:
在引用计数的环境中,drain确实执行与相同的操作release,因此两者在此意义上是等效的。要强调的是,这意味着您使用而不是不会泄漏池。drainrelease
在垃圾收集的环境中,release禁止操作。因此,它没有任何作用。 drain另一方面,向收集器暗示它应该“根据需要收集”。因此,在垃圾收集环境中,使用drain有助于系统平衡收集扫描。
- 3 回答
- 0 关注
- 566 浏览
添加回答
举报
0/150
提交
取消