В чем магия NSAutoreleasePool в рамках Objective-C/cocoa?

Я нашел пример Objective-C / cocoa framework имеет следующий код.

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Create an array
    NSArray *month = [NSArray arrayWithObjects:@ ... nill];

    [pool drain];
}
  • Q1: какая магия стоит за этим (зачем мне нужен код NSAutoreleasePool?)? Какая магия происходит между NSAutoreleasePool и pool drain заблокировать? Я вижу, что мне не нужно освобождать*month сам. Это потому, что он внутри NSAutoreleasePool и pool drain заблокировать?

  • Q2: с Xcode мне уже дана функция main (). В этом деле, как я могу использовать NSAutoreleasePool и pool drain?

например :

int main(int argc, char *argv[])
{
    //NSAutoreleasePool *pool = [[[NSAutoreleasePool] alloc] init];
    return NSApplicationMain(argc,  (const char **) argv);
}

3 ответов


Q1: магия заключается в том, что метод экземпляра NSObject-autorelease вызывает метод NSAutoreleasePool +addObject: class. Экземпляр NSObject объединяется в текущий экземпляр nsautoreleasepool. И метод экземпляра nsautoreleasepool-drain вызывает метод выпуска Объединенных экземпляров.

Это не совсем то же самое между реализацией какао Apple и GNUstep, но это подобный.

Я не уверен, почему месяц не выпущен,он должен быть выпущен стоком.

Q2: вы можете использовать NSAutoreleasePool везде, где хотите использовать. Создание экземпляра NSAutoreleasePool означает, что текущий пул будет изменен новым экземпляром. drain вернет текущий пул к предыдущему экземпляру.

кроме NSApplicationMain никогда возвращается. Он вызывает функцию EXIT для выхода из приложения и завершает процесс.


Вопрос 1:

вам не нужно освободить month экземпляр в Примере, который вы даете, потому что NSArray метод класса, который вы вызываете (arrayWithObjects:) возвращает экземпляр, который является autoreleased. По соглашению в Cocoa методы класса, начинающиеся с имени класса, будут возвращать экземпляры этого класса, выполненные автоматически. Эти примеры:

[NSString stringWithFormat:@"Holla %@", @"back girl!", nil];
[NSArray arrayWithObjects:@"Holla", @"back", @"girl!", nil];

возвращают экземпляры соответствующих объектов, autoreleased.


Я довольно новичок в Objective C, но позвольте мне дать этому трещину:

пул autorelease-это способ для Objective C обрабатывать сборку мусора несколько проще, чем вручную.

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

Итак, если у вас есть экземпляр объекта в "a", вы можете сделать:

это помещает его в AutoreleasePool: [a autorelease];

Это говорит пул autorelease, который вы хотите сохранить на некоторое время: [a retain];

когда вы называете [pool drain] теперь он заметит, что у вас есть одна ссылка на a, и он не будет освобождать память. Однако, если вы позже позвоните [a release] в следующий раз [pool drain] вызывается, он увидит, что больше нет ссылок на оставшееся, и освобождает память.

у меня есть тайное подозрение, что я только что говорил сам по кругу, не делая много смысла, но вот статья Википедии о подсчете ссылок:http://en.wikipedia.org/wiki/Reference_counting