2011-08-10 47 views
10

所以我試圖測試一個PhoneGap應用程序,我一直在努力,並且在我的iPad上測試過一些問題。我有以下作爲該應用程序的方法mainPhoneGap應用程序的iPad測試 - 主要方法中的問題

// 
// main.m 
// elog 
// 
// Created by Ben Potter on 9/08/11. 
// Copyright Arden Anglican School 2011. All rights reserved. 
// 

#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); 
    [pool release]; 
    return retVal; 
} 

,直到你徹底關閉應用程序,然後重新打開它,在它凍結這一切工作正常。我不知道爲什麼。

我用的XCode 4.2

在我的iPad運行iOS5最後,這些都是拿出了錯誤,感謝您的幫助!

Main method errors Direct link here

+0

XCode 4.2和iOS 5仍處於NDA之下。你的錯誤信息是說btw的音量。看到這裏 - http://stackoverflow.com/questions/6655842/nsautoreleasepool-is-unavailable。 – Perception

回答

19

你的應用程序正在使用自動引用計數(這是新的)和PhoneGap的不支持它。轉到您的項目的構建設置並關閉自動引用計數。

+2

我在哪裏可以找到構建設置? –

+0

我不能說別的 - 因爲這是在NDA之下。但是,如果您在左側面板中選擇主項目,然後選擇構建設置選項卡 - 您應該可以找到想要的項目。 – dtuckernet

+0

它仍然說我有問題,所以我最終恢復了我的iPad回到4.3 –

9

這就是我如何解決XCode 4.3和PhoneGap 1.5中的「NSAutoReleasePool」錯誤。

  1. 轉到Project Navigator中的「YourApplicationName」。

  2. 在Project下選擇「YourApplicationName」。

  3. 轉到生成設置。

  4. 確保切換「全部」和「組合」。

  5. 找到「Apple LLVM compiler 3.1 - Language」一節。

  6. 向下滾動,你會發現「Objective-C自動引用計數」。

  7. 從是更改它

嘗試重新建立你的項目,你應該罰款!

+0

令人驚歎!我總是從Apple LLVM更換爲LLVM GCC,但這只是部分糾正了這個問題。你的建議一勞永逸地解決了它,而且我可以使用Apple LLVM。謝謝。 – Jack

0

如果您不想禁用ARC,那麼以下內容將修復Xcode 4.2中的錯誤。

AppDelegate.m

// self.window = [[[UIWindow alloc] initWithFrame:screenBounds]autorelease]; 
     self.window = [[UIWindow alloc] initWithFrame:screenBounds]; 

    // self.viewController = [[[MainViewController alloc] init] autorelease]; 
     self.viewController = [[MainViewController alloc] init]; 

(void) dealloc 
{ 
    // [super dealloc]; 
} 

的main.m

int main(int argc, char *argv[]) { 
// NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
// int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); 
// [pool release]; 
// return retVal; 
    @autoreleasepool { 
    NSLog (@"Programming is fun!"); 
    } 
    return 0;  
} 

免責聲明:

不知道這將如何影響的PhoneGap的lib中的插件,其餘雖然。但是,在實施這些更改後,模板PhoneGap項目將在模擬器上運行,但會立即終止。這只是一個起點。

更好的選擇:

我建議你生成設置下禁用自動引用計數(ARC),直到PhoneGap的支持它。這個線程在PhoneGap論壇暗示ARC may be supported in PhoneGap 1.6.

1

所以,只是爲了澄清視覺傾斜,我花了幾分鐘找到正確的選項,因爲它只在另一個答案的評論中提到。我必須找到CLANG_ENABLE_OBJC_ARC構建標誌並將其切換爲NO。你會發現它下在用戶定義的部分構建設置(對我來說很底部):

enter image description here

我也可以通過進入main.m和註釋掉NSAutoreleasePool闖過運行時錯誤設置代碼是這樣的:

//NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); 
//[pool release]; 
return retVal; 

但是,我不確定可能會有什麼其他影響。目前看來,在使用PhoneGap的同時,最好還是堅持手工參考計數,直到PhoneGap正確支持ARC。

而僅僅爲谷歌,導致我在這裏的錯誤是「NSAutoreleasePool不可用」,因爲我沒有看到原文中的文字。

0

此前科爾多瓦2.1.0不支持ARC,你不應該勾選下面的框(當你還在創建項目): enter image description here

然而,這是你需要的確切代碼:

#import <UIKit/UIKit.h> 

int main(int argc, char *argv[]) { 

@autoreleasepool { 
    int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); 
    return retVal; 
    } 
} 

如果升級到2.1.0科爾多瓦在Xcode 4.5.1,你可以去: 編輯 重構 目的ARC和現代的Objective-C語法之間的選擇。 enter image description here