Core Foundation对象和保留/释放消息

时间:2011-09-28 20:45:17

标签: objective-c cocoa memory-management core-foundation

假设我们有一些Core Foundation对象,例如CGColorRef,它们会添加到NSArray中,如下所示:

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

由于数组保留其内容,color会收到retain消息(不是CFRetain(),对吧?)。从内存管理的角度来看,在这种情况下会发生什么?

1 个答案:

答案 0 :(得分:10)

From Core Foundation Design Concepts

  

从示例中注意,内存管理功能和方法也是可以互换的 - 您可以将CFRelease与Cocoa对象一起使用,将releaseautorelease与Core Foundation对象一起使用。

没有特别提到retain,但实际上,这也有效,copy(各种类'CFFooCreateCopy)和description({ {1}})。最后一个是在使用CFCopyDescription和其他字符串格式化函数和方法时,如何将CF对象作为%@格式规范的值传递。

结果相同:NSLogretain相同,CFRetainrelease相同,等等。

要注意的一些事项:

  • 在iOS 7和OS X 10.9之前,NSObject的CFRelease方法没有CF对应函数。 (7和10.9带来了autorelease函数。)如果您没有使用ARC,那么,如上面引用的文档中所述,您可以将CFAutorelease发送到CF对象,它的工作方式相同就像在NSObject上一样。
  • 您可以向autorelease发送消息,但不能在nil上调用CF函数(您将崩溃)。 Quartz有一些特定于类的函数,例如NULL / CGContextRetain,包括Release检查;是否要使用它们或者总是进行自己的NULL检查是一种风格问题。
  • CF的保留和释放功能在垃圾收集下工作,而NULLretain消息是无操作(就像发送到release一样)。除非您正在使用GC的Mac应用程序,否则无关紧要,在这种情况下,您需要在CF对象上使用nilCFRetain
  • 同样,在ARC下,CFReleaseretain消息将是非法的,CF对象将不会自动引用计数。您需要在CF对象上使用releaseCFRetain
  • 收藏总是做正确的事情,如记录所示。通常,这意味着强有力的参考。在GC之外,这意味着集合(数组,字典等)将保留并释放其对象,无论是自动(通过赋值,如果其代码是ARCified)还是手动(通过显式CFRelease和{{1}消息)。