Как использовать NSAutoreleasePool - PullRequest
0 голосов
/ 23 ноября 2011

Если я использую NSAutoreleasePool, каждый объект, созданный внутри пула, никогда не должен выпускаться вручную? Он будет освобожден при сливе из пула?

- (void) backgroundRequest{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        urlList = [[NSMutableArray alloc] init];
        target = [[NSMutableArray alloc] init];
      {
    //do stuff in here  

    }
    [urlList release];
    [target release];

    [pool release];
}

Правильны ли вышеуказанные строки, или я должен удалить [urlList release] и [target release]? ВАЖНО : я буду ждать объяснения и ответа. Спасибо

Ответы [ 3 ]

2 голосов
/ 23 ноября 2011

Пул авто-релиза работает только тогда, когда у вас есть объекты, использующие методы авто-релиза.

Если вы используете это:

urlList = [[NSMutableArray alloc] init];

Тогда вы захотите сделать свой собственный выпуск, да,Однако, если вы сделаете это:

urlList = [[[NSMutableArray alloc] init] autorelease];

Тогда вы можете позволить пулу NSAutorelease обрабатывать это.

1 голос
/ 25 ноября 2011

Если вы не хотите выпускать urlList и target, то вы можете использовать этот код:

- (void) backgroundRequest
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        urlList = [[[NSMutableArray alloc] init] autorelease];
        target = [[[NSMutableArray alloc] init] autorelease];
      {
    //do stuff in here  

    }

    [pool release];
}

Надеюсь, это поможет вам.

Дело в том, что AutoreleasePool заботится о тех выделениях, которые были автоматически освобождены с ключевым словом autorelease Так что, если вы используете это ключевое слово, вам не нужно его освобождать. Выпускается, когда выпускается AutoreleasePool.

Если вам нужна дополнительная информация, пожалуйста, оставьте мне сообщение ниже.

0 голосов
/ 23 ноября 2011

Я второй ответ от @Brayden. Я хотел бы добавить к этому. Как правило, каждый поток имеет свой пул автоматического выпуска. Смотрите ваш .main файл, например. С ним связан пул авто-релизов. Таким образом, ваш основной поток получил пул авто-релиза. Теперь, когда вы создаете другой поток, то есть попробуйте запустить некоторые методы в другом потоке, и если вы собираетесь использовать методы класса для общей инициализации.

eg: NSString *strTem = [NSString stringWithString:AnotherString];

Таков случай, когда будет использоваться авто-релиз, и для таких функций (методов) вам необходимо иметь отдельный пул авто-релизов.

Надеюсь, это поможет еще немного.

...