IPad тестирование приложения PhoneGap - проблемы в основном методе

Итак, я пытался протестировать приложение 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;
}

Все работает нормально, пока вы полностью не закрываете приложение, а затем снова его открывайте, после чего он замерзает. И я понятия не имею, почему.

Я запускаю ios5 на своем ipad с XCode 4.2

Наконец, это ошибки, которые возникают, спасибо за помощь!

Main method errorsПрямая ссылка здесь

Ответ 1

Ваше приложение использует автоматический подсчет ссылок (что является новым), а Phonegap еще не поддерживает его. Перейдите к настройкам сборки проекта и отключите автоматический подсчет ссылок.

Ответ 2

Вот как я решил ошибку "NSAutoReleasePool" в XCode 4.3 и PhoneGap 1.5.

  • Перейдите в "YourApplicationName" в Навигаторе проектов.

  • Выберите "YourApplicationName" в Project.

  • Перейдите к настройкам сборки.

  • Обязательно переключите "Все" и "Комбинировать".

  • Найдите раздел "Компилятор Apple LLVM 3.1 - Язык".

  • Прокрутите вниз, и вы найдете "Objective-C Автоматический подсчет ссылок".

  • Измените его с Yes на No.

Попробуйте снова создать проект, и все будет в порядке!

Ответ 3

Итак, чтобы уточнить для визуально-наклонного, мне потребовалось несколько минут, чтобы найти правильный вариант, поскольку он упоминается только в комментариях другого ответа. Мне нужно было найти флаг сборки CLANG_ENABLE_OBJC_ARC и переключить его на NO. Вы найдете его в настройках Build в разделе User-Defined (очень для меня):

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.

И только для Google ошибка, которая привела меня сюда, была "NSAutoreleasePool недоступен", поскольку я не вижу это как текст в исходном сообщении.

Ответ 4

Если вы не хотите отключать 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 может поддерживаться в PhoneGap 1.6.

Ответ 5

До кордовы 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, вы можете перейти к: редактировать Refactor Выбор между Objective ARC и Modern Objective-C синтаксисом. enter image description here