В чем магия 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