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 子类崩溃