Какао: основная функция int
Мне интересно, какую роль играет основная функция int в программе Какао? Практически весь пример кода, на который я смотрел, содержит только следующий код в main.m:
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
return NSApplicationMain(argc, (const char **) argv);
}
Что именно это делает, и где программа фактически начинает переходить через команды? Кажется, мои концепции требуют корректировки.
5 ответов
Поскольку проект Какао запускается как любой другой, точка входа для Операционной системы является главной. Однако архитектура Какао создана для фактического запуска обработки вашей программы из NSApplicationMain, который отвечает за загрузку исходного окна из вашего приложения и запуск цикла Events, используемого для обработки событий GUI.
Apple подробно обсуждает этот вопрос в Руководстве по основам Cocoa: базовая архитектура приложений в Mac OS X
Если вы хотите узнать, как управление переходит от "Запустить это" к main()
функция, страница руководства execve содержит детали. Вы также хотели бы прочитать о Dyld. main()
является частью стандарта Unix. Каждая программа, которую вы можете эффективно запустить, имеет main()
,
Как уже упоминали другие, NSApplicationMain
передает контроль Какао. Документация довольно конкретна относительно того, что она делает.
Одна интересная заметка, NSApplicationMain
на самом деле не каждый возврат. То есть, если бы вы разделили звонок на NSApplicationMain
от возвращения в вашем main
Функция и поместить код между ними, этот код никогда не будет выполнен.
main() является точкой входа для вашей программы.
Когда вы запускаете вашу программу, это первая вызванная функция. Ваша программа заканчивается, когда вы выходите из этой функции.
Также обратите внимание, что это не из Objective-C. Это просто C.
Посмотрите на страницу Википедии на нем
Мне интересно, где код начинает выполняться (например, почему подкласс NSView выполняется и рисует без моего явного вызова?), И если я не должен вставлять свой основной цикл в int main(), куда он идет?
В проекте xcode у вас есть файл main.m, который содержит функцию int main. На самом деле вы не найдете код, который явно обращается к NSView, этот код скрыт глубоко внутри каркаса iPhone или Mac OS X. Просто знайте, что внутри вашего int int скрыта петля событий, которая проверяет изменения, чтобы знать, когда обновлять ваше представление. Вам не нужно знать, где находится этот цикл событий, это не полезная информация, поскольку вы можете переопределять методы или создавать и назначать делегатов, которые могут что-то делать, когда это происходит.
Чтобы получить лучший ответ, вам нужно объяснить, что вы подразумеваете под "основным циклом", который вы хотите поместить в функцию "int main".
Это просто странно для меня оторваться от небольшого опыта в C++. Выглядит неестественно, что основная функция была бы такой пустой.
Вы можете инкапсулировать миллиард строк кода в одну функцию и поместить ее в int main. Не обманывайтесь тем, что главное состоит только из нескольких строк, что делается специально. Хорошее программирование учит нас хранить код в определенных контейнерах, чтобы он был хорошо организован. Apple решила сделать "реальную" точку запуска своих приложений для iPhone в одной строке кода в файле main.m:
int retVal = UIApplicationMain(argc, argv, nil, @"SillyAppDelegate");
Из этого одного куска кода запускается делегат приложения, который не вернет управление основной функции, пока это не будет сделано.
Значение, возвращаемое из main, возвращается процессом в операционную систему после завершения процесса.
Shell хранит значение, возвращаемое последним процессом, и вы можете получить его обратно с помощью $?
:
> ls
a b c
> echo $?
0
> ls x
x: No such file or directory
> echo $?
1
Это приложение, как и все остальное.
Вы можете использовать возвращаемое значение, чтобы связать несколько процессов вместе, используя сценарий оболочки или что-нибудь еще, что может выполнить процесс и проверить возвращаемое значение.