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_transfer
is used like so:
id MakeUUID(void) {
id result = nil;
CFUUIDRef uuid = CFUUIDCreate(NULL);
if (uuid) {
result = (__bridge_transfer id)uuid; // this "transfers" a retain from CF's control to ARC's control.
}
return result;
}
Edit: As other answers have mentioned, CFBridgingRelease()
does this for you. So instead of using (__bridge_transfer id)uuid
, it may be cleaner to write CFBridgingRelease(uuid)
. They are equivalent though, so it's up to you which you find more readable.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…