【问题标题】:NSAutoreleasePool in UIViewController life cycleUIViewController 生命周期中的 NSAutoreleasePool
【发布时间】:2011-09-29 07:12:10
【问题描述】:

我正在开发一款适用于 iPad 的应用程序。它提供了几个视图,所以我必须小心内存管理。

我的问题与自动释放对象有关。我想将 NSAutoreleasePool 关联到每个视图控制器。像这样的:

MyViewController.h

@interface MyViewController: UIViewController

@property (nonatomic, retain) NSAutoreleasePool *myPool;

MyViewController.m

@implementation MyViewController

@synthesize myPool;

- (void) viewDidLoad {
    myPool = [[NSAuroteleasePool alloc] init];    
}


- (void) dealloc {
    [myPool drain];
}

NSAutoreleasePool 不能用作属性。我想实现与此类似的行为。任何的想法?提前谢谢你。

编辑

感谢您的回答。回答你的问题(我还不能回答我的问题):

viewController 会做更多的事情,会响应事件等等。我想要的是,在所有这些操作之后,释放应该自动释放的东西。扩展示例:

MyViewController.h

@interface MyViewController: UIViewController

@property (nonatomic, retain) NSAutoreleasePool *myPool;

MyViewController.m

@implementation MyViewController

@synthesize myPool;

- (void) viewDidLoad {
    myPool = [[NSAuroteleasePool alloc] init];    
}


- (IBAction) whatEver: (id) sender {
    UIImage *img = [UIImage imageWithData: ...];
    NSString *str = @"MyString";
    ...
}

- (void) dealloc {
    [myPool drain];
}

在这里,字符串和图像会发生什么?我猜他们被保留在游泳池里,不是吗?我可以在 main 方法中等待释放池,但我想它会在应用程序结束时被耗尽。

【问题讨论】:

    标签: objective-c cocoa-touch uiviewcontroller nsautoreleasepool


    【解决方案1】:

    在这种情况下创建本地自动释放池是完全没有必要的。你确定你知道自动释放池是如何工作的吗?你到底想达到什么目的?

    (编辑问题后。)啊,我明白了。不了解 Cocoa 内存管理的请阅读the guide。每次runloop 迭代后,主自动释放池都会被耗尽,这使您的本地自动释放池完全无用。很少需要自定义自动释放池,主要是当您在循环中创建大量对象或在自己的线程中执行操作时。

    简而言之,忘记额外的自动释放池,一切都会正常工作。

    【讨论】:

      【解决方案2】:

      这是一个非常糟糕的主意。阅读Using Autorelease PoolsMemory Management Policy 首先。

      【讨论】:

        【解决方案3】:

        无需创建本地自动释放池。在 main.m 文件中,您有 NSAutoreleasepool 它会处理它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-28
          • 1970-01-01
          • 2011-07-30
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 2019-09-04
          相关资源
          最近更新 更多