Где установлен ваш делегат приложения и кто инициализирует его свойства окна и viewController?

У меня вопрос новичка о приложениях для IOS... Если я создаю новое View Based Application под названием TestForStackOverflow, то Xcode автоматически создает такой код для TestForStackOverflowAppDelegate.h:

@class TestForStackOverflowViewController;

@interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate>

@property (nonatomic, retain) IBOutlet UIWindow *window;

@property (nonatomic, retain) IBOutlet TestForStackOverflowViewController *viewController;

@end

и следующий в TestForStackOverflowAppDelegate.m:

#import "TestForStackOverflowAppDelegate.h"

#import "TestForStackOverflowViewController.h"

@implementation TestForStackOverflowAppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

[...]

Вот мои вопросы:

1) где класс TestForStackOverflowAppDelegate устанавливается как делегат для текущего приложения? Делается ли это "автоматически"? Я видел, что исходный файл main.m содержит только следующий код:

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

Не должен ли он устанавливать класс делегата приложения в четвертом параметре вызова функции UIApplicationMain?

2) где устанавливаются свойства window и viewController класса TestForStackOverflowAppDelegate?

3) это может быть тривиально, но почему мы должны синтезировать window = _window, не имея переменной экземпляра с именем _window в интерфейсе TestForStackOverflowAppDelegate? Я видел, что можно объявлять @свойства без наличия соответствующих iVars в интерфейсах классов (возможно, они автоматически создаются компилятором), но является ли это хорошей практикой или вы всегда должны создавать соответствующие iVars в своих классах?

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

15
задан Gianni Costanzi 23 September 2011 в 22:49
поделиться