Я работаю с Box2D (С++) и создаю объект Objective-C и назначаю его свойству body2D body userData
, имеющему тип void*
.
Теперь в некоторых случаях void* userData
может быть единственной активной ссылкой на объект ObjC. Поэтому, поскольку я использовал (__bridge void*)
в задании, ARC разрешает это. Это то, что мне нужно исправить.
Я размышлял над вариантами, чтобы это не происходило? Я читал документацию Clang ARC, в частности, части о литье мостов (а также Q & A на SO), а также кивнул различным конструкциям литья моста, которые они считают "плохо сформирован".
Тем не менее, моя первая мысль заключалась в использовании (__bridge_retained void*)
в первоначальном назначении userData. Но это заставило меня задуматься о том, как сохранить равновесие? Я, очевидно, не могу отправить релиз объекту.
Так должен ли я CFRelease()
объект? Или это должно быть CFBridgingRelease()
? Или оба незаконны здесь?
Является ли (__bridge_transfer void*)
отличным от userData
до временного типа идентификатора достаточно, возможно, при установке userData в NULL? Это даже хорошая идея?
Я знаю, что альтернативой было бы сохранить отдельный NSArray
/NSDictionary
для объектов userData
и синхронизировать их с временем жизни тела Box2D, добавляя и удаляя их в синхронизации с их телами Box2D.
Но это кажется излишним, потому что здесь я знаю, что я делаю, я знаю, что мне нужно +1
объект до тех пор, пока тело Box2D активно, и -1
объект, когда тело Box2D удалено, Плюс я знаю, что есть только два метода, когда тела Box2D добавляются и удаляются, а прямой доступ к userData
в моей структуре даже невозможен, потому что все объекты Box2D скрыты за интерфейсами Objective-C/wrappers.
Положив, возможно, "плохо сформированный" в сторону на мгновение, что бы вы порекомендовали мне в этой ситуации?