iOS 12.4.2 上的 iOS 崩溃“无法执行读取 Objective-C 的支持代码”而不是 12.0.1

Posted

技术标签:

【中文标题】iOS 12.4.2 上的 iOS 崩溃“无法执行读取 Objective-C 的支持代码”而不是 12.0.1【英文标题】:Ios crash "could not execute support code to read Objective-C" on ios 12.4.2 not on 12.0.1 【发布时间】:2019-10-21 15:57:36 【问题描述】:

此方法返回一个字符串的二维码图像。它在 ios 12.0.1 (iphone SE) 上正常工作,但在 12.4.2 (iphone 6) 上崩溃。当我尝试将结果UIImage 分配给UIImageView 时,方法崩溃,结果UIImage 不为零。

-(UIImage*)get_QR_image :(NSString*)qrString :(UIColor*)ForeGroundCol :(UIColor*)BackGroundCol

    NSData *stringData = [qrString dataUsingEncoding: NSUTF8StringEncoding];

    CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    [qrFilter setValue:stringData forKey:@"inputMessage"];
    [qrFilter setValue:@"H" forKey:@"inputCorrectionLevel"];


    CIImage *qrImage = qrFilter.outputImage;
    float scaleX = 320;
    float scaleY = 320;


    CIColor *iForegroundColor = [CIColor colorWithCGColor:[ForeGroundCol CGColor]];
    CIColor *iBackgroundColor = [CIColor colorWithCGColor:[BackGroundCol CGColor]];

    CIFilter * filterColor = [CIFilter filterWithName:@"CIFalseColor" keysAndValues:@"inputImage", qrImage, @"inputColor0", iForegroundColor, @"inputColor1", iBackgroundColor, nil];

    CIImage *filtered_image = [filterColor valueForKey:@"outputImage"];

    filtered_image = [filtered_image imageByApplyingTransform:CGAffineTransformMakeScale(scaleX, scaleY)];

    UIImage *result_image = [UIImage imageWithCIImage:filtered_image
                                                 scale:[UIScreen mainScreen].scale
                                           orientation:UIImageOrientationUp];


    return result_image;

崩溃涉及的行是:

filtered_image = [filtered_image imageByApplyingTransform:CGAffineTransformMakeScale(scaleX, scaleY)];

它会生成这个日志:

warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available.

我的方法中有一些东西只适用于 12.0.1 吗?或者可能有什么问题?我如何进行更多调查以解决该崩溃?

编辑

我有红色:

MyQrCodeImageViewBig.image=qrimage;

带有消息:

Thread 1: EXC_BREAKPOINT (code=1, subcode=0x1a83e146c)

【问题讨论】:

您能否发布崩溃消息本身? 我添加了有关崩溃的更多信息 【参考方案1】:

我发现[UIImage imageWithCIImage:] 初始化程序导致了很多问题。主要问题是 CIImage 实际上不包含任何位图数据。它需要首先由CIContext 呈现。因此,您将UIImage 分配给的目标需要知道它由仍需要渲染的CIImage 支持。通常UIImageView 处理得很好,但我不会太相信它。

您可以做的是将图像自己渲染为位图 (CGImage),然后用它初始化 UIImage。为此,您需要一个 CIContext,我建议您在此方法之外的某个位置创建它一次,并在每次需要渲染图像时重新使用它(这是一个昂贵的对象):

self.context = [CIContext context];

然后在你的方法中,你像这样渲染图像:

CGImageRef cgImage = [self.context createCGImage:filtered_image fromRect:[filtered_image extent]];
UIImage* result_image = [UIImage imageWithCGImage:cgImage];

【讨论】:

以上是关于iOS 12.4.2 上的 iOS 崩溃“无法执行读取 Objective-C 的支持代码”而不是 12.0.1的主要内容,如果未能解决你的问题,请参考以下文章

iOS13 上的 UISearchController 崩溃

iOS 10 上的 UILocalNotification 会崩溃吗

iOS 12 上的 UISearchController 子类崩溃

iOS9 上的 JavaScriptCore 崩溃

ios5 上的dismissViewControllerAnimated 崩溃

iOS 6 上的 MapKit 崩溃