【问题标题】:-[Not A Type retain]: message sent to deallocated instance-[Not A Type retain]:消息发送到释放的实例
【发布时间】:2011-11-03 10:43:22
【问题描述】:

我已将我的应用转换为使用 ARC。

在我有以下代码行之前:

NSArray *colors = [NSArray arrayWithObjects:startColor, endColor, nil];

由于 ARC 不允许将非 Objective-C 指针类型隐式转换为“id”,因此我重写了如下行:

NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];

在模拟器上一切正常,但在设备上,应用程序在上述行崩溃并显示错误消息:

-[Not A Type retain]: message sent to deallocated instance

有什么办法解决吗?

【问题讨论】:

  • 你的变量是什么类型的?周围的代码可以确定您是否需要__bridge__bridge_retained__bridge_transfer
  • 变量类型为CGColorRef。我不确定您所说的“周围代码”是什么意思,但我已经尝试了所有 3 个版本的“__bridge”,但问题仍然存在。
  • 如何创建 CGColorRef?你释放它吗?..
  • 我这样创建它:CGColorRef startColor = xColor.CGColor; 其中 xColor 在父类中属于 UIColor 类型。我应该保留它吗?

标签: ios ios5 automatic-ref-counting


【解决方案1】:

正如 hatfinch 在his answer here 中描述的那样,这种桥接演员可能不起作用,因为从-CGColor 返回的 CGColorRef 在您最后一次引用生成它的 UIColor 之后可能不会挂起。根据this Apple developer forum thread 中的讨论,我认为这是一个错误,但这是对如何管理这些 CGColorRefs 的生命周期的误读。

一种可行的方法是使用 UIColor 上的-CGColor 方法提供的内置桥接。与其像上面那样将 CGColor 保存到临时变量中,不如使用如下内容:

NSArray *colors = [NSArray arrayWithObjects:(id)[color1 CGColor],
                                            (id)[color2 CGColor], nil];

color1color2 是 UIColor 实例。

根据Transitioning to ARC Release Notes 的“编译器处理从 Cocoa 方法返回的 CF 对象”部分,-CGColor 方法会为您处理桥接。该文档目前缺少我上面的转换为 id ,这是编译它所必需的。

我已经对此进行了测试,它似乎在我的情况下有效,与 Ben 在上面链接的开发者论坛线程中报告的内容相匹配。

除了上述之外,您还可以显式保留和释放从 -CGColor 方法返回的 CGColorRefs,并在您的 NSArray 中桥接它们,就像 hatfinch 显示 here 一样。

【讨论】:

  • 没错。我自己以完全相同的方式解决了这个问题,但由于 StackOverflow 限制(在发布后几个小时回复你自己的问题),我无法回答我自己的问题。谢谢!
  • 你拯救了我的一天。为此,我已经把头发扯了好几个小时了。
  • 感谢你,我不必像 Jason 那样把头发扯掉!
【解决方案2】:

编辑:
如果您使用 UIColor 的 CGColor 属性,CGColor 将在您最后一次引用 UIColor 实例时消失。为避免这种情况,请直接在函数调用中“桥接”您的颜色:

NSArray *colors = [NSArray arrayWithObjects:[uiStartColor CGColor], [uiEndColor CGColor], nil];

这个方法在Apple's documentation中有描述

原文:
尝试分配一个变量:id color = (__bridge_transfer id)CGColorCreate(...); 并且对 CGColorCreate() 的直接返回值不执行任何其他操作

【讨论】:

  • 我试过id color = (__bridge_transfer id)CGColorCreateCopy(...);但是没有帮助
【解决方案3】:

感谢@Brad 提供 -CGColor 的提示!

我的应用程序在以下行崩溃,这将由 NSInvocation 对象调用。

    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);

解决方法是定义一个颜色属性并改用它。

    @property(strong, nonatomic) UIColor *backgroundColor;
    ......
    self.backgroundColor = [UIColor whiteColor];
    ......
    CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    相关资源
    最近更新 更多