当前位置:  开发笔记 > 编程语言 > 正文

没有Interface Builder的Cocoa,初始化app控制器的实例?

如何解决《没有InterfaceBuilder的Cocoa,初始化app控制器的实例?》经验,为你挑选了1个好方法。

打算在没有IB的情况下编写应用程序,我只是在尝试学习有关编程的更多信息.

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

希望有意义,并感谢任何帮助.



1> Peter Hosey..:

+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]在自己的路线,和威尔·希普利不分配给self所有),但基本思路是一样的:调用[super init[WithSomething:…]],确保它没"返回nil,如果没有则设置实例,并返回超类返回的内容.

这意味着,可以返回nilinit,实际上你可以.如果这样做,您应该[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.

你已经知道了这一点,但对于其他读过这篇文章的人来说:笔尖是你的朋友.Interface Builder是您的朋友.不要与框架作斗争,并以图形方式构建您的界面,您的应用程序将更好.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有