Почему шаблоны main.m для iOS включают в себя оператор возврата и пул автоматического выпуска? - PullRequest
9 голосов
/ 06 июля 2011

Я перечитывал UIApplicationMain документацию и задавался вопросом, если UIApplicationMain никогда не возвращается, почему:

  • есть return в конце?
  • естьтам NSAutoreleasePool?

Я даже спрашиваю себя: почему int main(int argc, char *argv[]) на iPhone?Можем ли мы запускать приложения с помощью командной строки?Для чего нужны argc и argv?Они используются или просто унаследованы от C?

Некоторые комментарии в Twitter от уважаемых товарищей таковы:

  • return здесь для компилятора
  • NSAutoreleasePool бесполезно.
  • циклу выполнения требуется выделение пула автоматического выпуска (противоречит # 2)

Ответы [ 2 ]

5 голосов
/ 06 июля 2011

1) Оператор return, вероятно, существует только потому, что компилятор не знает, что функция никогда не сможет вернуться (в конце концов, она не размечена каким-либо особым образом).Таким образом, анализ потока кода компилятора предупредит, что в нем отсутствует оператор return.Это все еще не объясняет, почему UIApplicationMain () имеет возвращаемое значение.Возможно, существует ошибка, при которой он на самом деле может вернуть, кто знает.

2) Я думаю, что наличие пула автоматического выпуска в main () вокруг UIApplicationMain не так,поскольку любой объект, освобожденный без пула, попадет в этот пул автоматического выпуска, который сохраняется в течение всей продолжительности приложения.Таким образом, объект по-прежнему протекает.

Обычно, если нет пула автоматического выпуска, среда выполнения регистрирует сообщение об ошибке об отсутствующем пуле и говорит разработчику установить точку останова на _NSAutoreleaseNoPool, чтобы найти, где находится пул.происходит автоматическое высвобождениеNSAutoreleasePool верхнего уровня, обнаруженный в шаблонах, таким образом, фактически скрывает эту утечку от пользователей.

UIApplicationMain () должен создавать свой собственный пул автоматического выпуска по мере необходимости (он должен создавать и удалятьв любом случае пул один раз проходит через цикл обработки событий, иначе объекты просто сложатся во внешнем пуле, потребляя всю память).Если кто-то думает, что ему действительно нужно запустить код ObjC перед вызовом UIApplicationMain () (и он не может выполнить ту же работу в applicationDidFinishLaunching: или лайках), он всегда может создать пул до UIApplicationMain ().Поскольку UIApplicationMain () задокументировано, что никогда не возвращается (например, exit ()), нет смысла в том, чтобы команды следовали за ним в любом случае.Пул никогда не будет освобожден.

Если вы посмотрите на шаблоны Mac, у них фактически нет пула.

3) Параметры используются, даже если дважды щелкнуть приложение вMac.Таким образом, ОС передает определенную информацию приложению.Первый параметр - это путь к исполняемому файлу при его запуске, который, как я полагаю, необходим для поиска файлов в комплекте.На Mac PSN (серийный номер процесса) также передается приложению в качестве параметра при запуске из Finder:

05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 0: /Volumes/RamDisk/MacTestApp-fdcuwfrzopalmgaufwujijhqhvjc/Build/Products/Debug/MacTestApp.app/Contents/MacOS/MacTestApp
05.07.11 22:18:54,129 [0x0-0x21e21e].com.thevoidsoftware.MacTestApp: 1: -psn_0_2220574
0 голосов
/ 06 июля 2011

Что касается аргументов, в iOS, если вы запускаете приложение напрямую, вы получаете только один аргумент, путь к приложению

2011-07-05 22:38:15.004 iCyril[2326:707] There are 1 args
Argument 1 : /var/mobile/Applications/7D58CC99-89C3-4F86-93D9-5FAF0756B706/iCyril.app/iCyril

Учитывая, что вы можете открывать файлы, читать URL и т. Д. Из методов делегата UIApplication, другая информация должна обрабатываться тем же механизмом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...