Восстанавливает ли 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 или связанной функции, чтобы отказаться от владения объектом.