我不打算在没有IB的情况下编写应用程序,我只是在尝试学习有关编程的更多信息.
如何在启动时获取AppController类的单个实例?(它通常是从笔尖加载的.)你可以清理使用+initialize
和-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]
在自己的路线,和威尔·希普利不分配给self
所有),但基本思路是一样的:调用[super init[WithSomething:…]]
,确保它没"返回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
.
你已经知道了这一点,但对于其他读过这篇文章的人来说:笔尖是你的朋友.Interface Builder是您的朋友.不要与框架作斗争,并以图形方式构建您的界面,您的应用程序将更好.