platypus
platypus

Reputation: 1205

CFBridgingRelease of a CFArray containing CFString

Suppose I have a CFArray containing CFString's:

CFStringRef strs[3];

CFArrayRef anArray;

strs[0] = CFSTR("String One");
strs[1] = CFSTR("String Two");
strs[2] = CFSTR("String Three");

anArray = CFArrayCreate(NULL, (void *)strs, 3, &kCFTypeArrayCallBacks);

If I use CFBridgingRelease to cast the CFArrayRef into an NSArray * (and in the process transfer the ownership of the array object to ARC), then does each element of the original array also get a CFBridgingRelease call automatically? It seems like, once I do:

NSArray * arrayInArc = CFBridgingRelease(anArray);

I can treat the elements of the NSArray as NSString's without having explicitly called CFBridgingRelease on each of the original CFStringRef:

NSString * a0 = arrayInArc[0];

Is there any documentation saying that when you transfer of the ownership of a collection (e.g., CFArray) to ARC, the ownership of its elements are also transferred?

Thanks,

Upvotes: 0

Views: 398

Answers (1)

Daij-Djan
Daij-Djan

Reputation: 50089

the CFBridingRelease doesn't change the type of the array.. CFArrayRef <> NSArray* is the same even before, It just tells the compiler to manage retain/release calls for you

how the array releases its contents is not affected by it.
YOU don't have references to the content, the array does! And the CFArrayRef/NSArray* manages the retain/release calls with/without arc.


the basic idea: only care about releasing stuff YOU own. (In this case the array itself)

Upvotes: 1

Related Questions