2011-01-23 5 views
1

Я сделал несколько условное кодирование в мое приложение, чтобы проверить AVCaptureDevice, но он по-прежнему падает мой IPod Touch (IOS 3.1.3) с этим сообщением:AVCaptureDevice держит сбой мой IPod Touch с OS 3

dyld: Символ не найдено: _OBJC_CLASS _ $ _ AVCaptureDevice

Реферировано от: /var/mobile/Applications/4286D40F-9E33-49AB-9AD9-4F66EB9331A5/TestApp.app/TestApp

Ожидаемые в:/System/Library/Frameworks/AVFoundation. каркас/AVFoundation

Форматы данных временно недоступны, повторите попытку после продолжения. (Не безопасно позвонить в dlopen в это время.)

mi_cmd_stack_list_frames: Недостаточно кадров в стеке.

mi_cmd_stack_list_frames: Недостаточно кадров в стеке.

В моем коде, я проверочные условия, как это:

#if (!TARGET_IPHONE_SIMULATOR) 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 // __IPHONE_4_0 
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    // ... more code 
#endif 
#endif 

Я проверяю здесь и другое место в коде, который использует AVCaptureDevice с этим же условным.

Я предполагаю, что более ранняя версия iOS для iPod не может ссылаться на новую библиотеку, так что я могу ее исправить?

ответ

1

Во-первых, вы не можете использовать директивы препроцессора для выбора кода для запуска здесь. Проверка должна выполняться во время выполнения, а не во время компиляции. Поэтому вы должны использовать NSClassFromString(), -respondsToSelector: или аналогичные методы для этого.

Во-вторых, чтобы сделать эту компиляцию, измените свой компилятор на LLVM GCC as described by Marco Arment.

+0

Кажется странным, что мне нужно будет использовать другой компилятор, чтобы приложение совместимо со старыми версиями ОС. Это ТОЛЬКО? – TigerCoding

+0

Вы также можете использовать технику 'NSClassFromString', которая всегда работала. Это просто более громоздко. И LLVM - лучший компилятор (и будущее), так что теперь вы можете сделать этот переключатель. –

+0

Я пробовал NSClassFromString и все еще получаю ошибку: id cls = (NSClassFromString (@ "AVCaptureDevice")); if (cls! = nil) {// ... Я очистил целевые объекты, удалил приложение с устройства, запустил его, и по-прежнему сохраняется та же проблема. Прямо в начале приложения я делаю эту проверку и устанавливаю флаг, чтобы предотвратить использование позже в приложении. Однако мои заявления NSLog даже не доходят до этой проверки. – TigerCoding

1

AVCaptureDevice доступен только на iOS версии 4 и выше. У вас есть два варианта:

  1. Проверьте систему версии и обрабатывать вещи надлежащим образом:

UIDevice *device = [UIDevice currentDevice]; 
if([device.systemVersion floatValue] 
    NSLog(@"Not supported on this software version"); 
}else{ 

//Proceed Normally 
} 

  1. Проверить класса availablility:


Class avcaptureclass = (NSClassFromString(@"AVCaptureDevice")); 

if (avCaptureClass != nil){ 
    //Proceed Normally 
}else{ 
    NSLog(@"Not supported on this software version."); 
} 

+0

Я пробовал оба ваших утверждения выше, и с обоими я все равно получаю ту же ошибку. – TigerCoding

2

Попробуйте проверить, если у вас есть AVfoundation.framework добавлен в ваши рамки
На мой взгляд, это самая вероятная причина ошибки

Смежные вопросы