NSMakeCollectable()
предназначен для (по существу устаревшего) сборщика мусора Objective-C. ARC ничего не знает об этом.
Вы должны использовать специальный атрибут приведения, обычно __bridge_transfer
, чтобы гарантировать, что память не просочилась. __bridge_transfer
используется так:
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;
}
Редактировать : Как уже упоминалось в других ответах, CFBridgingRelease()
делает это для вас. Таким образом, вместо использования (__bridge_transfer id)uuid
, может быть, лучше написать CFBridgingRelease(uuid)
. Хотя они эквивалентны, так что вам решать, что вы найдете более читабельным.