Може ли 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