Восстанавливает ли CFBridgingRelease владение существующим ссылкам без прямого назначения?

Если у меня есть следующий код:

// objective C++ code .mm
id<MTLTexture> texture = ...;
void* ptr = (void*)CFBridgingRetain(texture);
share_ptr_with_native_code(ptr);
[texture do_stuff]; // is this valid?

// native code .cpp
void share_ptr_with_native(void* ptr)
{
  ptr->do_stuff();
  CFBridgingRelease(ptr);
}

Будет texture быть действительным и сохранен ARC снова после вызова share_ptr_with_native()?

2 ответа

Решение

За исключением различных ошибок в вашем фрагменте кода, да, данная строка действительна. ARC продолжает сохранять свою сильную ссылку на object пока он все еще используется в верхнем коде, в дополнение к тому, за который вы отвечаете. CFBridgingRetain() имеет +1 эффект на счет сохранения объекта, следовательно, "сохранить" в его имени.

Даже если все сказано правильно, было бы лучше, если бы вы изменили

CFBridgingRelease(PTR);

в

CFRelease(ptr),

__bridge_retained или CFBridgingRetain направляет указатель Objective C на указатель Core Foundation, а также передает право собственности на вас. Вы несете ответственность за вызов CFRelease или связанной функции, чтобы отказаться от владения объектом.

Взято из https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html.

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