2014-01-17 43 views
1

引用這是代碼:崩潰`[NSApp表示運行]`當委託不再

@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]但我實在不明白,我錯過了什麼。如果我在run之前添加[NSApp finishLaunching],則會崩潰。

如果我沒有設置委託,它不會崩潰。

如果我之前引用委託,它工作正常:

AppDelegate* appDelegate = [[AppDelegate alloc] init]; 
[NSApp setDelegate:appDelegate]; 

所以我想它會立即釋放委託,因爲ARC,也因爲第一個版本的代表大概只有弱引用,對不對?但是,你應該如何做相同的代碼呢?

+0

莫非你嘗試按照這種方式設置委託:'[[NSApplication sharedApplication] setDelegate:self];' – divaka

+0

是否有任何理由不使用'NSApplicationMain(argc,(const char **)argv)'? – user3125367

+0

@ user3125367:是的(在我的情況下)。 – Albert

回答

4

是的,你猜對了,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]; 
    } 
} 

或設置你的appdelegate在main.m文件靜態的,例如,與ARC建立

static AppDelegate* _appDelegate; 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool 
    { 
     _appDelegate = [[AppDelegate alloc] init]; 
     [NSApplication sharedApplication]; 
     [NSApp setDelegate:_appDelegate]; 
     [NSApp run]; 
    } 
}