Управление памятью и выполнение. Выбор:
Что правильно? Это:
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];
}
Я знаю, что первый работает, но Кланг жалуется на это, поэтому я задаюсь вопросом, есть ли лучший шаблон для использования.
Я бы "попробовал" второй, но с автореализацией, кто знает, означает ли отсутствие EXC_BAD_ACCESS
, что вы делаете это правильно или вам просто повезло...
Ответы
Ответ 1
Сначала неправильно.
выполнитьSelectorInBackground: withObject: сохраняет как bar, так и foo до выполнения задачи. Таким образом, вы должны autorelease foo, когда вы его создаете, и пусть выполняет функциюSelectorInBackground: withObject позаботится об остальном. См. documentation
Последнее верно, потому что вы autorelease foo при его создании. Пул автообновлений, созданный вами в baz, не имеет ничего общего с правильностью управления памятью foo. Этот пул авторесурсов необходим для резервирования объектов с автореализацией внутри и выпускается в baz, он не затрагивает foo count count вообще.
Ответ 2
Правильный подход теперь фактически должен был сделать:
NSArray* foo = [[[NSArray alloc] initWithObjects:@"a", @"b", nil] autorelease];
[bar performSelectorInBackground:@selector(baz:) withObject:foo];
- (void)baz:(NSArray*)foo {
@autoreleasepool {
...
}
}