– :发送到释放实例的消息

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

在我有以下的代码行之前:

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

由于ARC不允许将非Objective-C指针types隐式转换为“id”,所以我重写了这样一行:

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

一切工作正常在模拟器上,但在设备上的应用程序崩溃在提到的行与错误信息:

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

任何想法如何解决?

这个桥接的转换可能无法正常工作,正如hatfinch在他的回答中所描述的那样,因为从-CGColor返回的-CGColor在你最后一次引用生成它的UIColor之后可能不会出现。 我认为这是一个基于在这个苹果开发者论坛的讨论线程的bug,但这是一个错误的如何pipe理这些CGColorRefs的生命周期。

其中一种方法是在UIColor上使用-CGColor方法提供的内置桥接。 您可以像上面那样将CGColor保存为临时variables,而不是像下面这样使用:

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

color1color1是UIColor实例。

根据“编译器处理从cocoa方法返回的CF对象”部分的过渡到ARC版本注释 , -CGColor方法将为您处理桥接。 该文档目前缺less转换为id,我有上面,这是需要得到这个编译。

我已经testing了这一点,它似乎对我的情况起作用,与上面链接的开发人员论坛主题中的Ben报告相匹配。

除上述之外,您还可以明确地保留并释放从-CGColor方法返回的-CGColor ,并将它们桥-CGColor您的NSArray中,就像hatfinch 在这里显示的一样。

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

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

苹果的文档中描述了这种方法

原版的:
尝试分配一个variables: id color = (__bridge_transfer id)CGColorCreate(...); 与CGColorCreate()的直接返回值无关

感谢@Brad的-CGColor的提示!

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

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

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

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