开发者

Core Foundation objects and retain/release messages

开发者 https://www.devze.com 2023-04-09 07:26 出处:网络
Let\'s say we have some Core Foundation objects, such 开发者_开发问答as CGColorRef, that are added to an NSArray like this:

Let's say we have some Core Foundation objects, such 开发者_开发问答as CGColorRef, that are added to an NSArray like this:

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

Since arrays retain their contents, color receives a retain message (not CFRetain(), right?). What happens in this case from memory management point of view?


From Core Foundation Design Concepts:

Note from the example that the memory management functions and methods are also interchangeable—you can use CFRelease with a Cocoa object and release and autorelease with a Core Foundation object.

It doesn't specifically mention retain, but, in practice, that works as well, as do copy (various classes' CFFooCreateCopy) and description (CFCopyDescription). The last is how you can pass CF objects as the value for a %@ formatting specification when using NSLog and other string-formatting functions and methods.

The result is the same: retain does the same as CFRetain, release does the same as CFRelease, etc.

A few things to be aware of:

  • Prior to iOS 7 and OS X 10.9, there is no CF counterpart function to NSObject's autorelease method. (7 and 10.9 brought the CFAutorelease function.) If you're not using ARC, then, as mentioned in the documentation quoted above, you can send autorelease to a CF object, and it works the same as on an NSObject.
  • You can send a message to nil, but you can't call CF functions on NULL (you'll crash). Quartz has some class-specific functions, such as CGContextRetain/Release, that include a NULL check; whether you want to use those or always do your own NULL checks is a matter of style.
  • CF's retain and release functions work under garbage collection, whereas retain and release messages are no-ops (as if sent to nil). Doesn't matter unless you're working on a GC'd Mac app, in which case you will need to use CFRetain and CFRelease on CF objects.
  • Similarly, under ARC, retain and release messages will be illegal and CF objects won't be automatically reference-counted. You will need to use CFRetain and CFRelease on CF objects.
  • Collections always do the right thing, as documented. Usually, this means a strong reference. Outside of GC, that means the collection (array, dictionary, etc.) will retain and release its objects, whether automatically (by assignments, if its code is ARCified) or manually (by explicit retain and release messages).
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号