为了账号安全,请及时绑定邮箱和手机立即绑定

NSAutoreleasePool自动释放池如何工作?

NSAutoreleasePool自动释放池如何工作?

喵喵时光机 2019-12-17 15:10:50
据我了解,使用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应用程序中最常见的是当前运行循环周期的结尾。


查看完整回答
反对 回复 2019-12-17
?
慕神8447489

TA贡献1780条经验 获得超1个赞

NSAutoreleasePool:消耗与释放

由于功能drain和release似乎是造成混乱,它可能是值得澄清这里(虽然这是覆盖在文档 ...)。


严格地说,从大局的角度drain是不等同于release:


在引用计数的环境中,drain确实执行与相同的操作release,因此两者在此意义上是等效的。要强调的是,这意味着您使用而不是不会泄漏池。drainrelease


在垃圾收集的环境中,release禁止操作。因此,它没有任何作用。 drain另一方面,向收集器暗示它应该“根据需要收集”。因此,在垃圾收集环境中,使用drain有助于系统平衡收集扫描。


查看完整回答
反对 回复 2019-12-17
  • 3 回答
  • 0 关注
  • 534 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信