您的Application Delegate设置在哪里以及谁初始化其window和viewController属性?

Gia*_*nzi 15 xcode objective-c uiapplicationdelegate ios

我有一个关于IOS应用程序的新手问题...如果我创建一个名为TestForStackOverflow的新的基于视图的应用程序,Xcode会自动为TestForStackOverflowAppDelegate.h创建这样的代码:

@class TestForStackOverflowViewController;

@interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate>

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

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

@end
Run Code Online (Sandbox Code Playgroud)

以及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;
}

[...]
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

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;
}
Run Code Online (Sandbox Code Playgroud)

它不应该在UIApplicationMain函数调用的第四个参数中设置应用程序委托类吗?

2)设置TestForStackOverflowAppDelegate类的窗口和viewController属性在哪里?

3)这可能是微不足道的,但为什么我们合成了window = _window,而没有在TestForStackOverflowAppDelegate接口中有一个名为_window的实例变量?我已经看到你可以在类接口中没有相应的iVar声明@properties(也许它们是由编译器自动创建的),但这是一个好习惯还是你总是应该在你的类中创建相应的iVars?

请原谅我很长的信息,我只是希望我没有写过一个太明显的问题,因为在意大利这里是深夜,我很累......但是当这些问题进入我的脑海时,我等不及了解决方案 :)

bry*_*mac 13

如何加载app委托类?

在您的-info.plist文件中有一个名为"主nib文件基本名称"的键,其视图类似于MainWindow.xib.在该xib文件中,有一个文件的所有者代理对象,并且它具有设置为app delegate类的委托.

在设计器中打开XIB.注意顶部的File's Owner对象,上下文单击它并查看委托对象.现在看一下(XCode 4)行下面的设计中的对象 - 你应该在那里看到app delegate对象.

appDelegate设置的窗口和viewController在哪里?

查看设计器和上下文,单击(XCode 4)行下方的app delegate对象.window和viewController目标绑在那里.

_window iVar

它会自动为您提供.我不清楚它是继承还是由编译器生成.

这里有关于_ iVars的更多内容: 为什么在iOS中使用前导下划线重命名合成属性?

如果您选择在代码中执行等效操作:

删除plist xib引用main.m:传递委托名称

int main(int argc, char *argv[])
{
    int retVal = UIApplicationMain(argc, argv, nil, @"HelloViewAppDelegate");
Run Code Online (Sandbox Code Playgroud)

在app委托中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    CGRect screenBounds = [[UIScreen mainScreen] applicationFrame];
    CGRect windowBounds = screenBounds;
    windowBounds.origin.y = 0.0;

    // init window
    [self setWindow: [[UIWindow alloc] initWithFrame:screenBounds]];

    // init view controller
    _mainViewController = [[MainViewController alloc] init];

    [[self window] addSubview:[_mainViewController view]];

    [self.window makeKeyAndVisible];
    return YES;
}
Run Code Online (Sandbox Code Playgroud)