Безопасно ли использовать соответствующие вызовы CFBridging для передачи в ARC и из ARC для типов без CF?
Я пишу игру, используя физический движок Бурундука, и я хотел бы хранить указатель на объект Objective-C в каждом теле userData
поле. Я знаю, что мне нужно использовать бросающий мост между id
а также void *
, но я не уверен, что то, как я это делаю, безопасно:
// When body is created
cpBody *body = cpBodyNew(...);
UserData *userData = [[UserData alloc] init];
cpBodySetUserData(body, CFBridgingRetain(body));
...
// When body is destroyed
UserData *userData = cpBodyGetUserData(body);
CFBridgingRelease(userData);
cpBodyFree(body);
Этот код, кажется, работает, но я также читал, что вы должны использовать только CFBridging*()
на объектах, которые можно бесплатно соединить с базовыми типами. поскольку UserData
происходит от NSObject
, а также NSObject
нет в списке бесплатных мостовых типов, похоже, я нарушаю это правило.
Мой код в порядке, потому что я в конце концов позвоню CFBridgingRelease
и не пытайтесь передать объект каким-либо другим функциям Core Foundation или есть другой способ переноса объектов Objective-C в и из C?
1 ответ
Это безопасно. NSObject
бесплатно соединяется с общим CFTypeRef
, Кроме того, я предполагаю, что вы не вызываете какие-либо другие функции Core Foundation на void*
так что это вряд ли имеет значение.