我不打算在没有 IB 的情况下编写应用程序,我只是在尝试更多地了解编程。
如何在启动时获取 AppController 类的单个实例?(它通常是从笔尖加载的。)你能弄清楚+initialize
and的使用-init
吗?如果我理解,+initialize
在启动时会调用所有类。如何使用它来创建我的 AppController 的实例,其中包含构成我的界面的实例变量?
希望这是有道理的,并感谢您的帮助。
我不打算在没有 IB 的情况下编写应用程序,我只是在尝试更多地了解编程。
如何在启动时获取 AppController 类的单个实例?(它通常是从笔尖加载的。)你能弄清楚+initialize
and的使用-init
吗?如果我理解,+initialize
在启动时会调用所有类。如何使用它来创建我的 AppController 的实例,其中包含构成我的界面的实例变量?
希望这是有道理的,并感谢您的帮助。
+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
。
您已经知道这一点,但对于其他阅读此内容的人来说:笔尖是您的朋友。界面生成器是您的朋友。不要与框架抗争——使用它,并以图形方式构建你的界面,你的应用程序会更适合它。
另一个解决在没有 nib 的情况下启动应用程序的问题。
无需分配您自己的控制器,只需在NSApplicationMain()
方法中使用额外的参数:
int retVal = NSApplicationMain(argc, argv, @"UIApplication", @"MyAppDelegate");
这会处理所有需要的正确链接。
然后,您需要记住的唯一另一件事是制作自己的窗口并将其设置为可见。
一组 NIB 似乎不是一个令人满意的答案,即使以 XML(作为 XIB)表示也是如此,因为没有简单的方法可以将它们与任何标准的颠覆或 SCM 风格的工具进行比较或合并。编码信息很脆弱,不打算仅由人类编辑。GUI 如何表示更改?我会逐步检查每个控件的每个属性并目视检查它们吗?
但是,如果应用程序的行为是用代码编写的,那么即使我必须同时掌握大量细节,我也有可能弄清楚其中发生了什么。
建议的解决方案:使用主要架构师编写的顶级 NIB,然后显式编写应用程序的其余部分。
有人有更好的主意吗?