【问题标题】:iOS: Receiver of message 'frame' is niliOS:消息“帧”的接收者为零
【发布时间】:2012-01-25 15:47:39
【问题描述】:

当我分析我的代码时,我得到以下逻辑错误:

消息'frame'的接收者是nil并且返回一个'CGRect'类型的值,这将是垃圾。

这两行:

CGRect rectFrame = purchaseCell.lblValue.frame;
CGRect rectFrameBG = purchaseCell.lblValueBG.frame;

代码运行良好,但只是想弄清楚这是在说什么。我做错了吗?

编辑:这是完整的方法:

purchaseCell.lblHeader.font = [UIFont fontWithName:@"AvenirNextLTPro-Regular" size:16];
purchaseCell.lblHeader.text = curField.fieldName;
purchaseCell.lblValue.text = curField.fieldValue;
purchaseCell.lblValueBG.text = curField.fieldValue;
purchaseCell.lblValue.font = [UIFont fontWithName:@"AvenirNextLTPro-Regular" size:16];
purchaseCell.lblValue.backgroundColor = [UIColor clearColor];
purchaseCell.lblValueBG.textColor = [UIColor clearColor];
[purchaseCell.lblValueBG sizeToFit];
[purchaseCell.lblValue sizeToFit];
CGRect rectFrame = purchaseCell.lblValue.frame;
CGRect rectFrameBG = purchaseCell.lblValueBG.frame;
NSLog(@"RectFrame X:  %.2f", rectFrame.origin.x);

purchaseCell.lblValue.frame = CGRectMake(rectFrame.origin.x-rectFrame.size.width,rectFrame.origin.y, rectFrame.size.width+14, rectFrame.size.height);
frameSizeWidth = rectFrame.size.width;
purchaseCell.lblValueBG.frame = CGRectMake(rectFrameBG.origin.x-rectFrameBG.size.width,rectFrameBG.origin.y, rectFrameBG.size.width+14, rectFrameBG.size.height);

【问题讨论】:

  • 我的猜测:这似乎表明purchaseCellpurchaseCell.lblValuepurchaseCell.lblValueBG 在某些情况下可以是nil,或者至少编译器认为它可能是。在这些情况下,.frame 将被发送到可能返回非法值的 nil 对象。您可能想检查这是否可能(即使它只是一个边界情况)。如果不是,则此警告可能源于编译器预测将采用哪些代码路径的能力有限。

标签: ios logic frame cgrect


【解决方案1】:

分析器这么说

purchaseCell.lblValue

计算为nil,因此无法为rectFrame 分配合理的值。你在用purchaseCell 做什么,它在代码中其他地方的属性?

“接收者”是指接收“帧”消息的对象。

看起来可能有一些代码分支,其中单元格或其 lblValue 属性可能为 nil,而分析器不喜欢它。如果您找不到真正的原因,@StilesCrisis 建议检查 nil 值并返回如果是,则可能会为您清除它(并防止任何可能的错误)。

【讨论】:

  • 我正在对 lblValue 和 lblValueBG 进行一些特殊的调整大小,我需要从当前帧开始,以便创建新的 CGRect。这一切都有效。 rectFrame 确实可以很好地从 lblValue 获取框架对象。
  • 您能否在问题中包含该方法的其余部分,或者它是否长达 27 页?
  • 好的,我更新了操作,基本上,每次更新 lblValue 中的测试时,它周围的背景标签都需要调整大小,因为我使用的字体从我在 xib 中的位置转移,我必须在代码中做一些特殊的转变
  • 可能在某些极端情况下它真的可能为零。我建议在方法的顶部检查它是否为 nil,如果是,则立即返回。
  • @StilesCrisis 同意,这将是一些分析器意大利面
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多