问题描述:
-
在iOS8各系统版本下,Swift中使用 “CIContext(options: nil)” 初始化CIContext,在模拟器运行时直接crash,错误如下:
reason: '-[CIContext initWithOptions:]: unrecognized selector sent to instance 0x7cc9dcb0' -
iOS9.0及以上系统这样初始化没问题
问题解读:
可能是将Swift方法CIContext(options: [String: Any]?)转换为Objective-C对应的+ (CIContext *)contextWithOptions:(NSDictionary<NSString *,id> *)选项时遇到了一些问题;相反,Swift中它被转换为-[CIContext initWithOptions:],因此无法识别选择器。原文
解决方案:(两种)
- 若初始化时不需要传options参数,则可直接初始化,let context = CIContext();或者区分一下系统版本,iOS9.0以下使用let context = CIContext()方法,iOS9.0及以上使用let context = CIContext(options: nil)方法。
- 声明一个Objective-C的CIContext类目,并将初始化方法重新封装成一个类方法,供Swift调用,然后在模块桥接头中导入这个类别,并将原来的初始化方法“CIContext(options: nil)”替换为对类别中的类方法的调用“CIContext.jy_context(options: nil)”。
类方法示例如下:
#import <CoreImage/CoreImage.h>
@interface CIContext (Workaround)
+ (CIContext *)jy_contextWithOptions:(NSDictionary<NSString *, id> *)options;
@end
#import "CIContext+Workaround.h"
@implementation CIContext (Workaround)
+ (CIContext *)jy_contextWithOptions:(NSDictionary<NSString *,id> *)options {
return [CIContext contextWithOptions:options];
}
@end
参考:
StackOverFlow的解决办法
iOS [CIContext initWithOptions:]: unrecognized selector sent to instance 模拟器 iOS 8.4
网友评论