Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone AVCaptureDevice一直在破坏我使用OS 3的iPod Touch_Iphone_Iphone Sdk 3.0_Ios4 - Fatal编程技术网

Iphone AVCaptureDevice一直在破坏我使用OS 3的iPod Touch

Iphone AVCaptureDevice一直在破坏我使用OS 3的iPod Touch,iphone,iphone-sdk-3.0,ios4,Iphone,Iphone Sdk 3.0,Ios4,我在我的应用程序中进行了一些条件编码以检查AVCaptureDevice,但它仍然会使我的iPod Touch iOS 3.1.3崩溃,并显示以下消息: dyld:找不到符号:_OBJC_CLASS_$\u AVCaptureDevice 引用自:/var/mobile/Applications/4286D40F-9E33-49AB-9AD9-4F66EB9331A5/TestApp.app/TestApp 预期位于:/System/Library/Frameworks/AVFoundation

我在我的应用程序中进行了一些条件编码以检查AVCaptureDevice,但它仍然会使我的iPod Touch iOS 3.1.3崩溃,并显示以下消息:

dyld:找不到符号:_OBJC_CLASS_$\u 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的另一个地方,该设备具有相同的条件


我猜iPods较旧的iOS版本无法链接到较新的库,因此我想如何更正它?

首先,您不能使用预处理器指令选择要在此处运行的代码。检查必须在运行时进行,而不是在编译时。因此,必须使用NSClassFromString、-respondsToSelector:或类似的技术来完成此操作


其次,要进行此编译,请将编译器更改为LLVM GCC。

首先,不能使用预处理器指令选择要在此处运行的代码。检查必须在运行时进行,而不是在编译时。因此,必须使用NSClassFromString、-respondsToSelector:或类似的技术来完成此操作


其次,要进行此编译,请将编译器更改为LLVM GCC。

AVCaptureDevice仅在iOS版本4及更高版本上可用。您有两个选择:

检查系统版本并妥善处理: 检查类的可用性:
AVCaptureDevice仅在iOS版本4及更高版本上可用。您有两个选择:

检查系统版本并妥善处理: 检查类的可用性:
尝试检查是否已将AVfoundation.framework添加到框架中
在我看来,这是导致错误的最可能原因

请尝试检查是否已将AVfoundation.framework添加到您的框架中
在我看来,这是导致错误的最可能原因

奇怪的是,我需要使用不同的编译器来使应用程序与较旧的操作系统版本兼容。这是唯一的方法吗?您也可以使用一直有效的NSClassFromString技术。只是更麻烦。不管怎样,LLVM是更好的编译器,也是未来的编译器,因此您最好现在就切换。我尝试了NSClassFromString,但仍然得到错误:id cls=NSClassFromString@AVCaptureDevice; 如果cls!=无{//…我已经清理了目标,从设备上删除了应用程序,并运行了它,但仍然存在相同的问题。在应用程序启动时,我进行了此检查,并设置了一个标志以防止以后在应用程序中使用。但是,我的NSLog语句甚至从未进行过此检查。当我注释掉代码中引用AVCaptureDevice的两个位置时,代码正常工作。如果我取消对代码的注释,并将其放在一个无法访问的块中,我仍然会得到错误。如果您想这样做,您不能直接在类上调用方法。类myClass=NSClassFromString…;id myInstance=[[myClass alloc]init…];似乎很奇怪,我需要使用不同的编译器才能使应用程序与较旧的操作系统版本兼容。这是唯一的方法吗?你也可以使用一直有效的NSClassFromString技术。它只是更麻烦。不管怎样,LLVM是更好的编译器,也是未来的编译器,所以你最好现在就切换。我尝试了NSClassFromString,但仍然获取错误:id cls=NSClassFromString@AVCaptureDevice;如果cls!=零{//…我已经清理了目标,从设备上删除了应用程序,并运行了它,但仍然存在相同的问题。在应用程序启动时,我进行了此检查,并设置了一个标志以防止以后在应用程序中使用。但是,我的NSLog语句甚至从未进行过此检查。当我注释掉代码中引用AVCaptureDevice的两个位置时,代码正常工作。如果我取消对代码的注释,并将其放在一个无法访问的块中,我仍然会得到错误。如果您想这样做,您不能直接在类上调用方法。类myClass=NSClassFromString…;id myInstance=[[myClass alloc]init…];我试过你上面的两个陈述,但两个都有相同的错误。我试过你上面的两个陈述,两个都有相同的错误。

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.");
}