Двойной режим ARC / GC и Core Foundation Bridging - PullRequest
6 голосов
/ 27 февраля 2012

Я пишу код, предназначенный для работы как в 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 с назначением с мостовым приведением.

Это, похоже, работает.Этот код в порядке?

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

Ваш второй фрагмент кода верен и, действительно, является лучшим способом обработки как ARC, так и GC.Вы также можете использовать CFMakeCollectable при создании объекта, а затем выполнить CFRelease следующим образом:

if ([NSGarbageCollector defaultCollector] == NULL) CFRelease (myCFString)

Но мне больше нравитсяу вас есть только один вызов, который работает для обеих сред.

1 голос
/ 28 февраля 2012

Ник,

Так как объекты CFO не обрабатываются ARC, вы можете захотеть сохранить здесь код, управляемый вручную.ARC действительно сосредоточена на Какао, а не на Основе.Тем не менее, вы сказали, что код работает, но он течет?Помните, что код ARC с неправильными флагами компилятора завершается с ошибкой.В этой документации Apple они утверждают, что ARC не управляет объектами CF: https://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html. Следовательно, я думаю, что ваш __bridge-код утечек и жду вашего подтверждения или отклонения от инструмента утечки инструментов.*

...