2013-03-29 9 views
2

У меня есть вопрос о autorelease, теперь у меня есть код ниже:отношения автореферата и runloop и нитки?

int main(int argc, char *argv[]){ 
@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
}} 

док говорит в конце @autoreleasepool {} объект помечается как autorelease получит сообщение об освобождении. но UIApplicationMain никогда не возвращается, что означает, что поток никогда не дойдет до конца @autoreleasepool, тогда объект, помеченный как autorelease, никогда не получит выпуск до тех пор, пока приложение не умрет. Там нет смысла autorelease .....

Я спросил кого-то, кто говорит, что система iOS будет генерировать некоторые потоки (вы знаете, один поток, один runloop). Он говорит, что runloop создаст пул автозаполнения .so объект автореферации будет выпущен в конце thead или runloop. Но в большинстве случаев мы используем основной поток. То, что он говорит, не убеждает меня.

Какой уместно использовать autorelease.It смутил меня долгое время.

я получаю другую точку, что объект autorelease получит освободить, когда один конец runloop (основной runloop будет существовать всю жизнь приложения ??), так что я не уверен ..

любой точки и соответствующий документ будет оцените!

+1

Я задал тот же вопрос. Скорее всего, для семантических/демонстрационных причин приемлемого поведения. Единственный выход из UIApplicationMain - это программа для 'exit()', поэтому любая память будет возвращена в операционную систему в любом случае. – borrrden

+0

Да, вы правы. – frank

ответ

5

Да, технически, UIApplicationMain никогда не возвращается, поэтому он никогда не попадет в конце этого @autoreleasepool блока, так что в этом случае, если вы удалили что @autoreleasepool блока не будет иметь никакого значения (кроме, может быть, все жалуются, что они были autoreleased без автореферат). Однако можно представить функцию main, написанную так, чтобы не всегда звонить UIApplicationMain (возможно, не в приложениях iOS, но в целом); то это будет иметь значение.

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

Что говорит человек, о котором вы говорили, это то, что внутри UIApplicationMain существует цикл запуска (бесконечный цикл, который обрабатывает события), и внутри каждой итерации есть пул автозапуска (или, возможно, несколько итераций; подробности реализации). Это не имеет ничего общего с пулом автообновлений в main.

+0

Спасибо. Я думаю, что я должен прочитать больше документов. – frank

 Смежные вопросы

  • Нет связанных вопросов^_^