2009-04-28 7 views
2
#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 
    NSLog(@"new event..."); 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
} 

Если это так, то функция main() должна быть вызвана на каждое событие, не так ли? Но я попробовал, и сообщение «новое событие ...» появляется только при запуске приложения. Поэтому я предполагаю, что в основной теме должен быть еще один пул автозапуска.- это главное место на самом деле, где каждый пул создается пул авторекламы основного цикла запуска?

ответ

5

№. Все классы Cocoa или CocoaTouch требуют наличия пула авторезистов, чтобы не утечка памяти. Таким образом, существующий пул авторасчетов требуется для вызова UIApplicationMain() для покрытия любых (возможно) автореализованных объектов, которые создаются в контексте UIApplicationMain(). Этот внешний пул авторезистов, как вы можете видеть, сбрасывается после возврата UIApplicationMain непосредственно перед выходом приложения. Внутренний (помните, что пулы автозапуска могут быть вложенными, а объекты с автореализацией добавляются в самый новый/самый глубокий пул). Пул автозапуска создается в начале каждой итерации цикла запуска приложения и освобождается в конце итерации. Таким образом, каждая итерация цикла цикла получает «собственный» пул авторезистов. Если обработка события может привести к большому количеству автореализованной памяти (плохая идея на iPhone, но довольно распространенная в OS X), вы можете захотеть создать свои собственные внутренние пулы автоопределений в коде обработки событий, который может быть выпущен во время обработки этого мероприятие.

+0

В чем смысл внешнего пула autorelease в main(), так как вся память приложения будет восстановлена ​​ОС при выходе в любом случае? И мне любопытно, почему Apple не просто включила пул авторесурсов верхнего уровня в реализацию UIApplicationMain(). –

+0

Спасибо. Да, мне тоже интересно ... может быть, есть некоторые вещи -autorelease, которые происходят рядом с основным циклом запуска в UIApplicationMain() ... – Thanks

+0

Метод + initialize отправляется классам, прежде чем они получат свое первое сообщение. Если авторы UIApplicationMain (или любая замена, поставляемая пользователем) очень осторожны, чтобы создать экземпляр пула автозаполнения ЛЮБОЙ другой вызов класса, порожденного какао, это может вызвать утечку памяти - те методы + инициализации могут создавать объекты автоопределения. Тогда самый безопасный план состоит в том, чтобы иметь пул авторесурсов, прежде чем вызывать код, который использует Cocoa. Разумеется, UIApplicationMain может создать свой собственный автозапуск. –

1

Нет, это самая внешняя функция в вашем приложении, обычная C-style main().

Все, что делает приложение iPhone, имеет место в UIApplicationMain, включая всю обработку событий.