Двойной режим ARC / GC и мостовое соединение Core Foundation

Я пишу код, предназначенный для работы как в ARC, так и в сборке мусора.

Вот фрагмент кода, который использует Core Foundation, поскольку он может быть написан специально для ARC:

CFTypeRef ref=CFCopySomething();
// At this point ref has retain count 1.
id obj=(__bridge_transfer id)ref;
// Ref still has retain count 1 but is now managed by ARC.
[obj doSomething];
// ARC will release ref when done.

Похоже, это эквивалентно:

CFTypeRef ref=CFCopySomething();
// At this point ref has retain count 1.
id obj=(__bridge id)ref;
// Now ref has retain count 2 due to assigning to strong variable under ARC.
CFRelease(ref)
// Now ref has retain count 1.
[obj doSomething];
// ARC will release ref when done.

Преимущество последнего в том, что вызов CFRelease позволяет GC собирать объект. Но я не уверен, что вызову CFRelease после передачи в ARC с назначением через мост.

Это определенно работает. Этот код в порядке?

6
задан Brad Larson 27 February 2012 в 18:10
поделиться