2012-06-08 176 views
0

我有點困惑,因爲我有一個類在其示例代碼中使用this 1st main.m,而我的項目使用後者。我在使用我的applicationDidFinishLaunching實現類時遇到了很多麻煩,我認爲這些不同的main.m文件可能是罪魁禍首。我的項目和示例項目之間的.xib文件與主筆尖名稱的.plist設置相同。代表們都與正確這兩個main.m有什麼區別?

#import <UIKit/UIKit.h> 
#import "MidiTestingAppDelegate.h" 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([MidiTestingAppDelegate class])); 
    } 
} 

而且

#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) 
{ 
#if __has_feature(objc_arc) 
    @autoreleasepool 
    { 
     int retVal = UIApplicationMain(argc, argv, nil, nil); 
     return retVal; 
    } 
#else 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, nil); 
    [pool release]; 
    return retVal; 
#endif 
} 

我認爲前者直開到App代表,而後者負荷的UIApplication直接?那是對的嗎?

+1

第二個有兩個編譯時分支:實際編譯哪個分支取決於ARC是否啓用。 –

+0

我希望像這樣的支票不會分散在整個項目中...... – Joe

+0

弧形支票散佈在我下載的整個課程中。這會有問題嗎? – frankie

回答

0

第二個例子是錯誤的形式。這是因爲@autoreleasepool可用於非ARC項目,實際上比創建自己的池更快(link)。

4

這裏有很多不良信息。首先,假設你有最新版本的Xcode,第一個版本就是你所需要的。

@autoreleasepool語法在非ARC項目中工作。編譯器將其全部計算出來,並在任何情況下都會生成適當的代碼。

第二段代碼使用功能檢測宏(__has_feature)根據是否啓用ARC來決定新的@autoreleasepool語法和創建池的傳統NSAutoreleasePool方法。如果您正在運行舊版本的Xcode,但沒有可用的新語法,則只需使用第二段代碼即可。

+0

+1,爲什麼這不是公認的答案?無論如何,他確實抄襲了這件事。 – CodaFi