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

Gyt*_*tis 18 ios ios5 automatic-ref-counting

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

在我有以下代码行之前:

NSArray *colors = [NSArray arrayWithObjects:startColor, endColor, nil];
Run Code Online (Sandbox Code Playgroud)

由于ARC不允许将非Objective-C指针类型隐式转换为'id',所以我重写了这样的行:

NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];
Run Code Online (Sandbox Code Playgroud)

一切都在模拟器上正常工作,但是在设备上,应用程序在提到的行上崩溃并显示错误消息:

-[Not A Type retain]: message sent to deallocated instance
Run Code Online (Sandbox Code Playgroud)

任何想法如何解决?

Bra*_*son 30

这个桥接演员可能不起作用,正如hatfinch在他的答案中描述的那样,因为-CGColor在你最后一次引用生成它的UIColor之后,返回的CGColorRef 可能不会挂起.根据Apple开发者论坛帖子中的讨论,我认为这是一个错误,但这是对如何管理这些CGColorRefs的生命周期的误读.

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

NSArray *colors = [NSArray arrayWithObjects:(id)[color1 CGColor],
                                            (id)[color2 CGColor], nil];
Run Code Online (Sandbox Code Playgroud)

使用color1color2成为UIColor实例.

-CGColor根据" 过渡到ARC发行说明 "中的"编译器处理从Cocoa方法返回的CF对象"部分,该方法可以为您完成桥接.该文档目前缺少我上面的转换为id,这是编译它所必需的.

我已经测试了这个,它似乎适用于我的情况,匹配Ben在上面链接的Developer Forums线程中报告的内容.

除上述外,你可以明确地保留和释放CGColorRefs从返回的-CGColor方法,然后再在你的NSArray跨天桥上他们,hatfinch显示在这里.