- [Not A Type retain]:发送给deallocated实例的消息

时间:2011-11-03 10:43:23

标签: ios ios5 automatic-ref-counting

我已将我的应用转换为使用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

任何想法如何解决?

3 个答案:

答案 0 :(得分:30)

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

这种方法的一种方法是使用UIColor上-CGColor方法提供的内置桥接。不像上面那样将CGColor保存到临时变量,而是应该能够使用如下内容:

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

color1color2是UIColor实例。

根据this Apple developer forum thread的“编译器处理从可可方法返回的CF对象”部分,-CGColor方法为您完成了桥接。该文档目前缺少我上面的转换为id,这是编译它所必需的。

我已经对此进行了测试,它似乎适用于我的情况,与上述链接的Developer Forums主题中的Ben报告相匹配。

除了上述内容之外,您还可以显式保留并释放从-CGColor方法返回的CGColorRefs,并在NSArray中将它们连接起来,同样,当hatfinch显示Transitioning to ARC Release Notes时。

答案 1 :(得分:0)

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

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

此方法在Apple's documentation

中描述

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

答案 2 :(得分:0)

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

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

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

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

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