在 iOS 7 之前的项目中编译警告“不兼容的指针类型初始化 'UIImage *' 使用类型为'CIImage * _Nullable”的表达式

Posted

技术标签:

【中文标题】在 iOS 7 之前的项目中编译警告“不兼容的指针类型初始化 \'UIImage *\' 使用类型为\'CIImage * _Nullable”的表达式【英文标题】:Compile warning “Incompatible pointer types initializing 'UIImage *' with an expression of type 'CIImage * _Nullable” on a pre iOS 7 project在 iOS 7 之前的项目中编译警告“不兼容的指针类型初始化 'UIImage *' 使用类型为'CIImage * _Nullable”的表达式 【发布时间】:2017-03-08 01:40:24 【问题描述】:

这是针对我的组织中以前运行的旧版应用程序显示编译警告而我没有任何运气调试它。 (我不是一个 Obj-C 开发人员)。

功能是:

static void newDrawTextInRect(UILabel *self, SEL _cmd, CGRect rect)

  if (![self.text cxa_doesWrapInvisibleIdentifiers] ||
      !titleSettingsPairs[self.text])
    origDrawTextInRect(self, @selector(drawTextInRect:), rect);
    return;
  

  UIImage *img = [titleSettingsPairs[self.text] image];
  CGSize size = img.size;
  CGPoint point = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
  point.x = ceilf(point.x - size.width/2);
  point.y = ceilf(point.y - size.height/2);

  BOOL drawsShadow = ![titleSettingsPairs[self.text] shadowDisabled];
  CGContextRef context;
  if (drawsShadow)
    context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetShadowWithColor(context, CGSizeMake(0, -1), 0, [[UIColor blackColor] colorWithAlphaComponent:1./3.].CGColor);
  

  [img drawAtPoint:point];
  if (drawsShadow)
    CGContextRestoreGState(context);

并且抛出错误的行是:UIImage *img = [titleSettingsPairs[self.text] image];

编辑:在titleSettingsPairs周围添加上下文

static NSMutableDictionary *titleSettingsPairs;

&&

+ (void)load

  static dispatch_once_t once;
  dispatch_once(&once, ^
    titleSettingsPairs = [NSMutableDictionary dictionary];
  );

&&

+ (void)dealloc

  titleSettingsPairs = nil;

&&

- (void)cxa_setSettings:(CXAMenuItemSettings *)settings

  if (!self.title)
    @throw [NSException exceptionWithName:@"UIMenuItem+CXAImageSupport" reason:@"title can't be nil. Assign your item a title before assigning settings." userInfo:nil];

  if (![self.title cxa_doesWrapInvisibleIdentifiers])
    self.title = [self.title cxa_stringByWrappingInvisibleIdentifiers];

  titleSettingsPairs[self.title] = settings;

编辑:原来崩溃不是由这个问题引起的。

【问题讨论】:

什么是titleSettingsPairs,它是如何声明的? @rmaddy 我已经添加了我能想到的问题。谢谢! 【参考方案1】:

如果这个表达式:

[titleSettingsPairs[self.text] image]

导致CIImage,可以从 CIImage 生成 UIImage,如下所示...

// change the existing line to assign a CIImage
CIImage *ciImage = [titleSettingsPairs[self.text] image];
// build a UIImage from that 
UIImage *image = [[UIImage alloc] initWithCIImage:ciImage];

但是这个故事有些地方不太对劲:这不能解决运行时崩溃,而且编译时警告将无法通过集合看到。试一试,看看会发生什么。

顺便说一下,考虑添加一些防御性代码来防止将 nil 添加到集合中,如下所示:

// so we don't crash if settings is nil
if (settings)
    titleSettingsPairs[self.title] = settings;  // would crash if assigning nil

【讨论】:

解决了编译警告?? 从相机胶卷加载的图像仍然出错。如果您有任何帮助,这里是显示的屏幕截图 → dropbox.com/s/tzyna6agtvxgxvf/… 按照出现的日志消息中的说明修复了崩溃(与代码警告无关)。感谢您的帮助。 是的。该屏幕截图解释了崩溃。我曾经以这种方式遇到过旧版应用程序崩溃。从 OS10 开始(我认为),使用许多板载功能照片、联系人等,需要一个 info.plist 字符串来解释应用程序的基本原理。见这里***.com/a/39519960/294949 使用该确切答案来解决问题。有趣的是它一直都在那里,我只是没有阅读整个日志消息。【参考方案2】:

尝试修改

表格

UIImage *img = [titleSettingsPairs[self.text] image];

UIImage *img = [[UIImage alloc] initWithCIImage:[titleSettingsPairs[self.text] image];

【讨论】:

以上是关于在 iOS 7 之前的项目中编译警告“不兼容的指针类型初始化 'UIImage *' 使用类型为'CIImage * _Nullable”的表达式的主要内容,如果未能解决你的问题,请参考以下文章

得到错误而不是不兼容的指针类型警告

qsort 的第四个参数的“不兼容的指针类型”编译器警告

Xcode 7 - 不兼容的块指针类型

警告:从 C 中不兼容的指针类型返回

gcc编译选项-Wextra(启用额外的警告信息,提高代码质量和安全性)

iOS不兼容的块指针类型问题