2011-01-23 46 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

预期:/系统/资源库/框架/ 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与此相同条件的其他地方。

我猜的iPod旧的IOS版本无法链接到新库,所以我?如何解决呢?

回答

1

首先,你不能使用预处理指令选择在这里运行的代码。检查必须在运行时发生,而不是在编译时。所以你必须使用NSClassFromString(),-respondsToSelector:或类似的技术来做到这一点。

其次,使这个编译,改变你的编译器GCC LLVM as described by Marco Arment

+0

看来很奇怪,我需要使用不同的编译器来使应用程序与旧版本的操作系统兼容。这是唯一的方法吗? – TigerCoding 2011-01-23 13:32:04

+0

你也可以使用一直工作的`NSClassFromString`技术。这只是更麻烦。无论如何,LLVM是更好的编译器(和未来),所以你现在可以做出转换。 – 2011-01-23 13:35:28

1

AVCaptureDevice仅在iOS版本4及更高版本。你有两个选择:

  1. 检查系统版本和妥善处理的事情:

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

//Proceed Normally 
} 

  1. 检查类可用性等:


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

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

2

尝试,如果你有检查AVfoundation.framework添加到您的框架
在我看来,这是错误的最可能的原因