0

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

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

MyViewController.h

@interface MyViewController: UIViewController

@property (nonatomic, retain) NSAutoreleasePool *myPool;

我的视图控制器.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;

我的视图控制器.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 方法中等待释放池,但我想它会在应用程序结束时被耗尽。

4

3 回答 3

2

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

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

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

于 2011-09-29T07:25:50.530 回答
1

这是一个非常糟糕的主意。首先阅读使用自动释放池内存管理策略

于 2011-09-29T07:32:49.173 回答
0

无需创建本地 autorelease pool.in main.m 文件,您拥有 NSAutoreleasepool 它会处理它。

于 2011-09-29T07:55:59.513 回答