我在我的应用程序中进行了一些条件编码以检查AVCaptureDevice,但它仍然使用以下消息使我的iPod Touch(iOS 3.1.3)崩溃:
dyld:未找到符号:_OBJC_CLASS _ $ _ AVCaptureDevice
引用自:/var/mobile/Applications/4286D40F-9E33-49AB-9AD9-4F66EB9331A5/TestApp.app/TestApp
预期于:/System/Library/Frameworks/AVFoundation.framework/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无法链接到较新的库,所以我该如何更正呢?
答案 0 :(得分:2)
尝试检查是否已将AVfoundation.framework添加到您的框架中 在我看来,这是错误的最可能原因
答案 1 :(得分:1)
首先,您不能使用预处理程序指令来选择在此处运行的代码。检查必须在运行时进行,而不是在编译时进行。因此,您必须使用NSClassFromString()
,-respondsToSelector:
或类似技术来执行此操作。
其次,要进行此编译,请将编译器更改为LLVM GCC as described by Marco Arment。
答案 2 :(得分:1)
AVCaptureDevice仅适用于iOS 4及更高版本。您有两种选择:
UIDevice *device = [UIDevice currentDevice];
if([device.systemVersion floatValue]
NSLog(@"Not supported on this software version");
}else{
//Proceed Normally
}
Class avcaptureclass = (NSClassFromString(@"AVCaptureDevice"));
if (avCaptureClass != nil){
//Proceed Normally
}else{
NSLog(@"Not supported on this software version.");
}