Есть ли причина изменять файл main.m в ваших iOS-приложениях? - PullRequest
15 голосов
/ 03 ноября 2011

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

Есть ли причина для изменения файла main.m? Мне интересно, нужно ли когда-нибудь трогать этот файл. Если вы измените его, почему?

Ответы [ 3 ]

17 голосов
/ 03 ноября 2011

В 99,9% случаев нет необходимости прикасаться к main.m.

В остальных 0,1% вы можете изменить аргументы вызова на функцию UIApplicationMain(). Последние два аргумента этой функции указывают имена классов, представляющих ваше основное приложение (UIApplication по умолчанию) и делегат приложения.

Если вы когда-нибудь решите подкласс UIApplication, вы должны установить третий аргумент для имени вашего подкласса. Подклассы UIApplication могут быть полезны, если вы хотите перехватить определенные события, которые обрабатывает ваше приложение (переопределить sendEvent:).

Имя вашего класса делегата приложения может измениться, если вы просто решите переименовать этот класс. Кроме того, если четвертый аргумент UIApplicationMain() равен nil (который используется по умолчанию в шаблонах проектов, которые не используют раскадровку в iOS 5), это означает, что вы создаете объект делегата приложения в основном файле NIB вашего приложения. Если вы когда-нибудь решите изменить это решение (например, адаптировать раскадровку для существующего проекта), вам придется изменить четвертый аргумент, чтобы сообщить UIApplicationMain() имя класса, который он должен создать.

11 голосов
/ 03 ноября 2011

В некоторых случаях вы можете захотеть изменить этот файл. По умолчанию шаблоны разработки для iOS предполагают, что вы будете использовать Interface Builder для предоставления своего начального интерфейса, и при этом в качестве последнего аргумента UIApplicationMain() будет указано значение nil, как показано ниже:

return UIApplicationMain(argc, argv, nil, nil);

Если вы хотите программно построить интерфейс, вам может потребоваться указать класс делегата приложения, используя этот последний параметр:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class]));

Это сделано для того, чтобы приложение знало, с чего начать при создании интерфейса. С одним из них, созданным с использованием Interface Builder, вы указываете, какой IB-файл использовать в качестве базы, с помощью одного из ваших ключей Info.plist.

Если у вас есть файл main.m, созданный до автоматического подсчета ссылок, у вас может быть явный NSAutoreleasePool, который оборачивает эту функцию:

NSAutoreleasePool *pool = [NSAutoreleasePool new];      
int retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([SPAppDelegate class]));
[pool release];
return retval;  

В ARC это будет преобразовано в @autoreleasepool:

@autoreleasepool {
    int retVal = UIApplicationMain(argc, argv, nil,NSStringFromClass([SPAppDelegate class]));
    return retVal;
}

Это только два случая, когда я редактировал файл main.m любым способом.

0 голосов
/ 03 ноября 2011

Как правило, вам не нужно трогать файл main.m. Это все стандартный код. Любая инициализация обычно выполняется в вашем делегате приложения.

...