問題描述
我已將我的應用轉換為使用 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];
其中 color1
和 color2
是 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]:消息發送到已釋放的實例的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!