Подтвердить что ты не робот

Управление памятью и выполнение. Выбор:

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

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, что вы делаете это правильно или вам просто повезло...

4b9b3361

Ответ 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 {
        ...
    }
}