-[Not A Type retain]:消息发送到已释放的实例

时间:2023-03-25
本文介绍了-[Not A Type retain]:消息发送到已释放的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

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

I have converted my app to use ARC.

在我有以下代码行之前:

Before I had the following line of code:

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

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

Since the implicit conversion of a non-Objective-C pointer type to 'id' is disallowed with ARC, I rewrote the line like this:

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

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

Everything works fine on the simulator, however on the device the app crashes on the mentioned line with the error message:

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

有什么办法解决吗?

推荐答案

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

This bridged cast may not work, as hatfinch describes in his answer here, because the CGColorRef returned from -CGColor may not hang around after your last reference to the UIColor that generates it. I thought this was a bug, based on the discussion in this Apple developer forum thread, but it was a misreading of how to manage the lifetime of these CGColorRefs.

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

One way that this will work is to use the built-in bridging provided by the -CGColor method on UIColor. Rather than saving out your CGColor to a temporary variable as you do above, you should be able to use something like the following:

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

其中 color1color2 是 UIColor 实例.

with color1 and color2 being UIColor instances.

-CGColor 方法会为您处理桥接,根据 过渡到 ARC 发行说明.该文档目前缺少我上面的转换为 id ,这是编译它所必需的.

The bridging is taken care of for you by the -CGColor method, according to the "The Compiler Handles CF Objects Returned From Cocoa Methods" section of the Transitioning to ARC Release Notes. The documentation is currently missing the cast to id that I have above, which is required to get this to compile.

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

I've tested this, and it seems to work in my case, matching what Ben reports in the above-linked Developer Forums thread.

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

In addition to the above, you can explicitly retain and release the CGColorRefs returned from the -CGColor method and bridge them across in your NSArray, again as hatfinch shows here.

这篇关于-[Not A Type retain]:消息发送到已释放的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:如何通过 NSURLConnection sendAsynchronousRequest 取消异步调用? 下一篇:应用程序窗口应该在应用程序启动结束时有一个根视图控制器 - 即使所有已知问题都已修复

相关文章