正确使用@autoreleasepools的方法?

Kon*_*d77 4 cocoa-touch memory-management objective-c autorelease nsautoreleasepool

我想知道以下代码是否是使用new的好方法@autoreleasepool,我应该这样使用它还是让主autoreleasepool处理对象?

  • (void)callingAutoReleasedObject,可能是我的viewDidAppear,或者类似的函数.

谢谢!

- (UIBarButtonItem*)backButton {
    UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithTitle:@"CustomBackTitle"
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:nil
                                                                  action:nil];
    return [backButton autorelease];
}

- (void) callingAutoReleasedObject {

    @autoreleasepool {
        [[self navigationItem] setBackBarButtonItem:[self backButton]];
    }
}
Run Code Online (Sandbox Code Playgroud)

dav*_*ode 8

来自Apple的参考:

但是,有三种情况可能会使用您自己的自动释放池:

  • 如果您正在编写不基于UI框架的程序,例如命令行工具.

  • 如果编写一个创建许多临时对象的循环.您可以在循环内创建一个自动释放池,以便在下一次迭代之前处理这些对象.在循环中使用自动释放池有助于减少应用程序的最大内存占用量.

  • 如果你产生一个辅助线程.一旦线程开始执行,您必须创建自己的自动释放池; 否则,您的应用程序将泄漏对象.(有关详细信息,请参阅"自动释放池和线程".)

我个人创建了几个@autoreleasepool块,以避免在使用Core Data的后台同步期间出现HEAVY内存泄漏,因为框架(我喜欢)创建了大量自动释放的对象,必须将其耗尽以保留可用内存;)