2011-09-28 74 views
2

比方說,我們有一些核心基礎對象,如CGColorRef,被添加到一個NSArray這樣的:核心基礎對象和保留/釋放消息

CGColorRef color = ...; 
NSArray *array = [NSArray arrayWithObject:(id)color]; 

因爲數組保留其內容,color收到retain消息(不是CFRetain(),對吧?)。從內存管理的角度來看,在這種情況下會發生什麼?

回答

10

From Core Foundation Design Concepts:從例子中的內存管理功能和方法也

注互換,你可以使用CFRelease與可可對象和releaseautorelease了Core Foundation對象。

它沒有具體提及retain,但在實踐中,因爲這樣做的作品,以及,copy(各種班CFFooCreateCopy)和descriptionCFCopyDescription)。最後一個是如何在使用NSLog和其他字符串格式函數和方法時將CF對象作爲%@格式規範的值傳遞。

的結果是一樣的:retain不一樣CFRetainrelease不一樣CFRelease

有幾件事情需要注意的:

  • 此前的iOS 7和OS X 10.9,NSObject的autorelease方法沒有CF對應函數。 (7和10.9帶來了CFAutorelease函數)。如果你沒有使用ARC,那麼,如上面引用的文檔中所述,你可以發送autorelease到一個CF對象,它的工作原理與NSObject相同。
  • 您可以發送信息至nil,但您無法通過NULL調用CF功能(您會崩潰)。 Quartz具有一些類特定功能,如CGContextRetain/Release,其中包括一個NULL檢查;無論你想使用那些還是始終做自己的NULL檢查都是風格問題。
  • CF的保留和釋放函數在垃圾回收下工作,而retainrelease消息沒有操作(就像發送到nil一樣)。除非您正在使用GC'd Mac應用程序,否則無關緊要,在這種情況下,您需要在CF對象上使用CFRetainCFRelease
  • 同樣,在ARC下,retainrelease消息將是非法的,並且CF對象不會被自動引用計數。您需要在CF對象上使用CFRetainCFRelease
  • 收集始終做正確的事情,如記錄。通常,這意味着一個強有力的參考。在GC之外,這意味着集合(數組,字典等)將自動(通過分配,如果其代碼被ARC化)或手動(通過明確的retainreleaserelease消息)保留並釋放其對象。