Управление памятью и выполнениеSelectorInBackground: - PullRequest
12 голосов
/ 17 мая 2009

Что правильно? Это:

NSArray* foo = [[NSArray alloc] initWithObjects:@"a", @"b", nil];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];

- (void)baz:(NSArray*)foo {
    ...
    [foo release];
}

Или:

NSArray* foo = [[[NSArray alloc] initWithObjects:@"a", @"b", nil] autorelease];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];

- (void)baz:(NSArray*)foo {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    ...
    [pool release];
}

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

Я бы "просто попробовал" 2-й, но с автоматическим выпуском, кто знает, означает ли отсутствие EXC_BAD_ACCESS, что вы делаете все правильно или вам просто повезло ...

Ответы [ 2 ]

24 голосов
/ 17 мая 2009

Во-первых, это неправильно.

executeSelectorInBackground: withObject: сохраняет и bar, и foo до тех пор, пока задача не будет выполнена. Таким образом, вы должны автоматически высвобождать foo при его создании, и пусть executeSelectorInBackground: withObject позаботится обо всем остальном. См. документацию

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

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

Правильный подход сейчас будет на самом деле:

NSArray* foo = [[[NSArray alloc] initWithObjects:@"a", @"b", nil] autorelease];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];

- (void)baz:(NSArray*)foo {
    @autoreleasepool {
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...