NSAutoreleasePool в жизненном цикле UIViewController - PullRequest
0 голосов
/ 29 сентября 2011

Я работаю в приложении для 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];
}

Что будет со строкой и изображением?Я предполагаю, что они сохранены в бассейне, не так ли?Я мог бы дождаться пула релизов в основном методе, но я думаю, он будет исчерпан, когда приложение завершится.

Ответы [ 3 ]

2 голосов
/ 29 сентября 2011

В этом случае совершенно не обязательно создавать локальные пулы автоматического выпуска. Вы уверены, что знаете, как работают авто-релизы? Что именно вы пытаетесь достичь?

(После редактирования вопроса.) А, понятно. Вы не понимаете, как управлять памятью Какао, прочитайте руководство . Основной пул авто-выпуска очищается после каждой итерации runloop , что делает ваши локальные пулы авто-выпуска полностью бесполезными. Пользовательские пулы автоматического выпуска редко нужны, в основном, когда вы создаете много объектов в цикле или когда делаете что-то в своем собственном потоке.

Короче говоря, забудьте о дополнительных пулах автоматического выпуска, и все будет работать нормально.

1 голос
/ 29 сентября 2011

Это очень плохая идея.Сначала прочитайте , используя пулы автоматического освобождения и политику управления памятью .

0 голосов
/ 29 сентября 2011

Нет необходимости создавать файл Local autorelease pool.in main.m у вас есть NSAutoreleasepool, он позаботится об этом.

...