Может ли 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, поэтому их можно использовать взаимозаменяемо.

Другие вопросы по тегам