iPad测试PhoneGap应用程序 - 主要方法的问题

时间:2011-08-10 06:14:04

标签: objective-c xcode ipad cordova

所以我试图测试我一直在研究的PhoneGap应用程序,并且在我的iPad上测试时遇到了一些问题。我有以下作为此应用程序的main方法:

//
//  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

5 个答案:

答案 0 :(得分:19)

您的应用程序正在使用自动引用计数(这是新的),而Phonegap尚不支持它。转到项目的构建设置并关闭“自动引用计数”。

答案 1 :(得分:9)

这就是我在XCode 4.3和PhoneGap 1.5中解决“NSAutoReleasePool”错误的方法。

  1. 转到Project Navigator中的“YourApplicationName”。

  2. 在“项目”下选择“YourApplicationName”。

  3. 转到“构建设置”。

  4. 确保切换“全部”和“合并”。

  5. 找到“Apple LLVM编译器3.1 - 语言”部分。

  6. 向下滚动,您会发现“Objective-C自动参考计数”。

  7. 将其从“是”更改为“否”

  8. 尝试再次构建项目,你应该没问题!

答案 2 :(得分: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不可用”,因为我在原帖中没有看到它作为文本。

答案 3 :(得分: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项目在模拟器上运行,但立即终止。这只是一个起点。

更好的选择:

我建议你在Build Settings下禁用自动引用计数(ARC),直到PhoneGap支持它。 PhoneGap论坛上的这个帖子提示ARC may be supported in PhoneGap 1.6.

答案 4 :(得分:0)

在cordova 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;
    }
}

如果你在Xcode 4.5.1中升级到cordova 2.1.0,你可以去: 编辑 重构 在Objective ARC和现代Objective-C语法之间做出选择。 enter image description here