假设我们有一些Core Foundation对象,例如CGColorRef
,它们会添加到NSArray
中,如下所示:
CGColorRef color = ...;
NSArray *array = [NSArray arrayWithObject:(id)color];
由于数组保留其内容,color
会收到retain
消息(不是CFRetain()
,对吧?)。从内存管理的角度来看,在这种情况下会发生什么?
答案 0 :(得分:10)
From Core Foundation Design Concepts:
从示例中注意,内存管理功能和方法也是可以互换的 - 您可以将
CFRelease
与Cocoa对象一起使用,将release
和autorelease
与Core Foundation对象一起使用。
没有特别提到retain
,但实际上,这也有效,copy
(各种类'CFFooCreateCopy
)和description
({ {1}})。最后一个是在使用CFCopyDescription
和其他字符串格式化函数和方法时,如何将CF对象作为%@
格式规范的值传递。
结果相同:NSLog
与retain
相同,CFRetain
与release
相同,等等。
要注意的一些事项:
CFRelease
方法没有CF对应函数。 (7和10.9带来了autorelease
函数。)如果您没有使用ARC,那么,如上面引用的文档中所述,您可以将CFAutorelease
发送到CF对象,它的工作方式相同就像在NSObject上一样。autorelease
发送消息,但不能在nil
上调用CF函数(您将崩溃)。 Quartz有一些特定于类的函数,例如NULL
/ CGContextRetain
,包括Release
检查;是否要使用它们或者总是进行自己的NULL
检查是一种风格问题。NULL
和retain
消息是无操作(就像发送到release
一样)。除非您正在使用GC的Mac应用程序,否则无关紧要,在这种情况下,您需要在CF对象上使用nil
和CFRetain
。CFRelease
和retain
消息将是非法的,CF对象将不会自动引用计数。您需要在CF对象上使用release
和CFRetain
。CFRelease
和{{1}消息)。