2012-09-05 65 views

回答

5

你應該能夠投它:

CFArrayRef *myLegacyArray = ... 

... 

NSArray *myArray=[(NSArray *)myLegacyArray copy]; 
+0

非常感謝!我現在就試試! – user1574429

+1

你不需要複製它。一個免費的橋樑演員字面上只是'NSArray * myNsArray =(NSArray *)myCfArray;' – jjv360

+0

這隻適用於非ARC代碼。 –

37

好了,首先你要知道,如果你正在使用ARC與否,因爲規則的改變。接下來,你需要知道你真的想要對演員進行什麼。你只是想使用價值,還是轉讓所有權?

我會認爲ARC是因爲IMO所有的新代碼真的應該使用ARC(而ARC就是其中的投射問題更普遍)。

CFArrayRef someArrayRef = ...; 
NSArray *array = (__bridge NSArray*)someArrayRef; 

上面的代碼連鑄CF參考,可以在當前的上下文中使用的NSArray*。沒有發生所有權轉讓。 someArrayRef仍然保留其參考,你仍然必須手動發佈someArrayRef或它會泄漏。

CFArrayRef someArrayRef = ...; 
NSArray *array = CFBridgingRelease(someArrayRef); 

在這段代碼中,您不僅可以獲得投票,而且可以轉讓所有權。 someArrayRef現在不再擁有引用,所以不需要手動發佈。相反,當array版本發佈時,該對象將釋放(假設其他地方沒有其他引用)。

+0

看起來像CFBridgingRelease是在ARC環境中走的路。始終轉移到NS ...並使用CFBridgingRelease –