Objective c 您的应用程序委托设置在哪里?谁初始化其窗口和viewController属性?

Objective c 您的应用程序委托设置在哪里?谁初始化其窗口和viewController属性?,objective-c,ios,xcode,uiapplicationdelegate,Objective C,Ios,Xcode,Uiapplicationdelegate,我有一个关于IOS应用的新手问题。。。如果我创建一个名为TestForStackOverflow的新的基于视图的应用程序,Xcode会自动为TestForStackOverflowAppDelegate.h创建如下代码: @class TestForStackOverflowViewController; @interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate> @property

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

@class TestForStackOverflowViewController;

@interface TestForStackOverflowAppDelegate : NSObject <UIApplicationDelegate>

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

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

@end
我的问题来了:

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) TestForStackOverflowAppDelegate类的窗口和视图控制器属性在哪里设置

3) 这可能很简单,但为什么我们有synthesis window=\u window,而在TestForStackOverflowAppDelegate接口中没有名为_window的实例变量?我已经看到,您可以声明@properties,而不必在类接口中拥有相应的ivar(可能它们是由编译器自动创建的),但这是一种好的做法,还是应该始终在类中创建相应的ivar

请原谅我这么长的留言,我只是希望我没有写一个太明显的问题,因为在意大利这里已经是深夜了,我很累。。但是当这些问题出现在我的脑海中时,我迫不及待地想得到答案:)

1)简单一点,当调用
UIApplicationMain()

  • 您的应用程序。plist已找到
  • 查找键“Main nib file base name”
  • 这个XIB被打开了
  • 支持
    UIApplicationLegate
    协议的对象被实例化并用作应用程序委托
2) 它们设置在XIB中,如果需要,可以查看它们

  • 打开主XIB
  • 选择AppDelegate对象
  • 打开此对象的连接检查器
  • 查看出口部分
3) 没错,它们是由编译器自动创建的。它通过减少行数使代码更具可读性,并且在只声明属性的一个位置时更易于重构


希望有帮助

应用程序委托类是如何加载的?

在-info.plist文件中有一个名为“Main nib file base name”的键,其视图类似于MainWindow.xib。在该xib文件中,有一个文件的所有者代理对象,它将一个委托设置为app delegate类

在设计器中打开该XIB。注意顶部文件的所有者对象,上下文单击它并查看委托对象。现在看一下(XCode 4)行下面的设计中的对象-您应该在那里看到app delegate对象

appDelegate集合的窗口和视图控制器在哪里?

查看设计器并在上下文中单击(XCode 4)行下方的app delegate对象。窗口和viewController目标绑定在那里

\u窗口iVar

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

以下是关于iVars的更多信息:

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

移除plist xib参考 main.m:传递代理的名称

int main(int argc, char *argv[])
{
    int retVal = UIApplicationMain(argc, argv, nil, @"HelloViewAppDelegate");
应用程序内代理:

- (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;
}

好啊我检查了MainWindow.xib文件,该文件在plist文件中被引用为主NIB文件,我看到它中定义了一些对象,例如TestForStackOverflow应用程序委托和TestForStackOverflow视图控制器。我知道它们连接到相应的类,但从检查器中看不到这一点:检查器引用TestForStackOverflowAppDelegate,而从不引用TestForStackOverflowAppDelegate类。只有将MainWindow.xib文件作为XML文件打开时,我才能看到对“真实”类的引用。。顺便说一句,我知道魔法发生在哪里:)这只是另一个疑问。。。创建基于HelloWorld视图的应用程序时,自动创建的MainWindow.xib文件仅用于指向应用程序委托和视图控制器类,对吗?它不用于绘制应用程序的界面,因为您有HelloWorldViewController.xib文件用于此目的,或者我遗漏了什么?我理解这些可能是显而易见的问题,但我正试图把所有的谜题放在一起:)在MainWindow.xib中,应用程序委托的实例(在下面的行中)有一个viewController子类的视图控制器目标和添加的xib。因此,在这种情况下,主窗口仅用于加载。可能已添加从UIViewController继承的MainWindow.m/h,该MainWindow.m/h可能是目标ViewController。但是…但是,我的2美分。。。最终,界面生成器非常擅长布局。控制每个控件的各个方面最好用代码来控制,因为(1)我可以复制/粘贴我一直在做的块,而不是记住我在IB中签入了哪些框;(2)合并起来要容易得多。因此,我通过上面的代码进行初始化,没有任何魔力或混乱。我仍然仅将IB用于布局。相关:
- (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;
}