I’m trying to convert my old project to ARC. I have a function which creates UUIDs, but apparently this is no longer supported when using ARC:
NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
//[uuid autorelease];
CFRelease(theUUID);
}
I get the compiler error (when trying to convert): ‘NSMakeCollectable’ is unavailable: not available in automatic reference counting mode.
So my question is: how do I create UUIDs when using ARC? Is there another way which I should now use?
NSMakeCollectable()is for the benefit of the (essentially deprecated) Objective-C garbage collector. ARC knows nothing about it.You must use a special casting attribute, usually
__bridge_transfer, to ensure that the memory is not leaked.__bridge_transferis used like so:Edit: As other answers have mentioned,
CFBridgingRelease()does this for you. So instead of using(__bridge_transfer id)uuid, it may be cleaner to writeCFBridgingRelease(uuid). They are equivalent though, so it’s up to you which you find more readable.