4

打算在没有 IB 的情况下编写应用程序,我只是在尝试更多地了解编程。

如何在启动时获取 AppController 类的单个实例?(它通常是从笔尖加载的。)你能弄清楚+initializeand的使用-init吗?如果我理解,+initialize在启动时会调用所有类。如何使用它来创建我的 AppController 的实例,其中包含构成我的界面的实例变量?

希望这是有道理的,并感谢您的帮助。

4

3 回答 3

7

+initalize当一个类或它的一个子类第一次接收到消息时,它被发送到一个类。所以,当你这样做时:

instance = [[[YourClass alloc] init] autorelease];

alloc消息触发initialize

如果你对子类做同样的事情:

instance = [[[SubclassOfYourClass alloc] init] autorelease];

alloc消息将以+[YourClass initialize]与另一个相同的方式触发(在触发之前)+[SubclassOfYourClass initialize]。但只有其中一个会这样做 - 每个类都initialize不会被多次调用。(除非你自己调用它[super initialize][SomeClass initialize]- 所以不要那样做,因为该方法不会期待它。)

-init,另一方面,初始化一个新实例。在表达式[[YourClass alloc] init]中,您亲自将消息直接发送到实例。您也可以通过另一个初始化程序 ( [[YourClass alloc] initWithSomethingElse:bar]) 或便利工厂 ( [YourClass instance]) 间接调用它。

与 不同initialize的是,您应该始终向init您的超类发送(或另一个初始化程序,如果合适)。大多数 init 方法大致如下所示:

- (id) init {
    if ((self = [super init])) {
        framistan = [[Framistan alloc] init];
    }
    return self;
}

细节不同(此方法或超类或两者都可能带参数,有些人更喜欢单独使用self = [super init], Wil Shipley根本不指定self),但基本思想是相同的:调用[super init[WithSomething:…]],确保它没有t return nil,如果没有设置实例,则返回超类返回的任何内容。

这意味着nil可以从回来init,而且确实可以。如果你这样做,你应该[self release]这样做,这样你就不会泄漏失败的对象。(为了检测无效的参数值,另一种方法是NSParameterAssert,如果断言失败,它会抛出异常。每个的相对优点超出了这个问题的范围。)

如何使用它来创建我的 AppController 的实例,其中包含构成我的界面的实例变量?

最好的方法是做这一切main

int main(int argc, char **argv) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    AppController *controller = [[[AppController alloc] init] autorelease];
    [[NSApplication sharedApplication] setDelegate:controller]; //Assuming you want it as your app delegate, which is likely
    int status = NSApplicationMain(argc, argv);

    [pool drain];
    return status;
}

您将在您的应用程序委托方法中进行任何其他设置AppController

您已经知道这一点,但对于其他阅读此内容的人来说:笔尖是您的朋友。界面生成器是您的朋友。不要与框架抗争——使用它,并以图形方式构建你的界面,你的应用程序会更适合它。

于 2009-03-08T05:27:55.487 回答
2

另一个解决在没有 nib 的情况下启动应用程序的问题。

无需分配您自己的控制器,只需在NSApplicationMain()方法中使用额外的参数:

int retVal = NSApplicationMain(argc, argv, @"UIApplication", @"MyAppDelegate");

这会处理所有需要的正确链接。

然后,您需要记住的唯一另一件事是制作自己的窗口并将其设置为可见。

于 2010-12-09T23:45:38.047 回答
1

一组 NIB 似乎不是一个令人满意的答案,即使以 XML(作为 XIB)表示也是如此,因为没有简单的方法可以将它们与任何标准的颠覆或 SCM 风格的工具进行比较或合并。编码信息很脆弱,不打算仅由人类编辑。GUI 如何表示更改?我会逐步检查每个控件的每个属性并目视检查它们吗?

但是,如果应用程序的行为是用代码编写的,那么即使我必须同时掌握大量细节,我也有可能弄清楚其中发生了什么。

建议的解决方案:使用主要架构师编写的顶级 NIB,然后显式编写应用程序的其余部分。

有人有更好的主意吗?

于 2009-12-30T23:26:57.470 回答