Может ли ARC управлять объектами Core Foundation без бесплатных звонков?

Если у меня есть объект 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);
}

person John-Paul Gignac    schedule 13.05.2015    source источник


Ответы (1)


Каждый объект CoreFoundation (CFTypeRef) также является объектом Objective-C (id).

В старые времена, до того, как CFAutorelease() был введен в 10.9, не-ARC-код автоматически выпускал объекты CoreFoundation, используя идиому [(id)<CFTypeRef> autorelease], которая была возможна из-за того, что объекты CoreFoundation были объектами Objective-C.

Соответствие заключается в том, почему в ARC объект CoreFoundation может быть __bridge_transfer передан в ARC.

Так что да, вы можете безопасно передать право собственности на любой объект CoreFoundation в ARC.

Если вы пройдёте свой пример кода на уровне ассемблера, вы обнаружите, что ARC вызывает _objc_release, который, в свою очередь, в конечном итоге вызывает CFRelease.

Примечание. Бесплатными мостовыми объектами являются объекты, для которых существуют точные эквиваленты в CoreFoundation и Objective-C, поэтому их можно использовать взаимозаменяемо.

person CRD    schedule 13.05.2015
comment
Иными словами, CFType базовый класс Core Foundation бесплатно подключается к NSObject. - person Ken Thomases; 14.05.2015
comment
@KenThomases - Да, но, к сожалению, его нет в списке таблица Apple бесплатных мостовых типов, поэтому я пошел на более многословное объяснение. - person CRD; 14.05.2015
comment
Конечно. Это не было критикой, просто дополнение. - person Ken Thomases; 14.05.2015
comment
@KenThomases - это не было воспринято как единое целое, без проблем. Просто было бы неплохо, если бы Apple поместила это в свою таблицу, тогда ответ мог бы быть короче! - person CRD; 14.05.2015
comment
Обратите внимание, что не все объекты Cocoa являются подклассами NSObject (например, NSProxy и OSObject), и некоторые объекты CF не обязательно связаны бесплатным мостом со своими аналогами Cocoa (например, CFBundle ‹-› NSBundle). И комментарий KenT неверен: CFType НЕ подключен к NSObject бесплатно. - person geowar; 24.07.2015