2011-09-28 54 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消息)保留并释放其对象。