Может ли ARC управлять объектами Core Foundation без мостов?
Если у меня есть базовый базовый объект с бесплатными мостами, могу ли я безопасно передать право собственности на ARC или эта привилегия зарезервирована для типов с бесплатными мостами?
Например:
- (id)myBundle {
CFBundleRef b = CFBundleCreate(NULL, self.bundleURL);
return b == NULL ? nil : (__bridge_transfer id)b;
}
- (UInt32)myBundleVersionNumber {
return CFBundleGetVersionNumber((__bridge CFBundleRef)self.myBundle);
}
1 ответ
Каждый объект CoreFoundation также является объектом Objective-C. В старые времена, до CFAutoRelease()
был введен в 10.9, код не-ARC будет автоматически освобождать объекты CoreFoundation, используя идиому [(id)<CFTypeRef> autorelease]
; это стало возможным благодаря объектам CoreFoundation, являющимся объектами Objective-C.
Соответствие - это то, почему в ARC объект CoreFoundation может быть __bridge_transfer
в АРК.
Таким образом, ответ - да, вы можете безопасно передать право собственности на любой объект CoreFoundation в ARC.
Если вы пройдете по своему примеру кода на уровне ассемблера, вы найдете вызов ARC _objc_release
что, в свою очередь, в конечном итоге вызов CFRelease
,
Примечание. Бесплатными мостовыми объектами являются те, в которых есть точные эквиваленты в CoreFoundation и Objective-C, поэтому их можно использовать взаимозаменяемо.