这是代码:
@interface AppDelegate : NSObject <NSApplicationDelegate>
@end
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
printf("My app delegate: finish launching\n");
}
@end
int main(int argc, char *argv[])
{
@autoreleasepool
{
[NSApplication sharedApplication];
[NSApp setDelegate:[[AppDelegate alloc] init]];
[NSApp run];
}
}
它在[NSApp run]
中崩溃,但我并没有真正看到我所缺少的东西。如果我在[NSApp finishLaunching]
之前添加run
,则会在那里崩溃。
如果我没有设置委托,它就不会崩溃。
如果我之前引用该委托,它可以正常工作:
AppDelegate* appDelegate = [[AppDelegate alloc] init];
[NSApp setDelegate:appDelegate];
所以我猜它会因为ARC而在第一个版本中立即释放委托,因为委托可能只是一个弱引用,对吧?但是你应该怎么做相同的代码?
答案 0 :(得分:5)
是的,你猜对了,NSApplication
不保留代表,(弱引用ARC)。
因此,您可以使用-fno-objc-arc
使用当前代码构建main.m文件:
int main(int argc, char *argv[])
{
@autoreleasepool
{
[NSApplication sharedApplication];
[NSApp setDelegate:[[AppDelegate alloc] init]];
[NSApp finishLaunching];
[NSApp run];
}
}
例如,或在main.m中设置AppDelegate static,并使用ARC
进行构建static AppDelegate* _appDelegate;
int main(int argc, char *argv[])
{
@autoreleasepool
{
_appDelegate = [[AppDelegate alloc] init];
[NSApplication sharedApplication];
[NSApp setDelegate:_appDelegate];
[NSApp run];
}
}