Сохранение объектов ARC в классах С++
У меня есть код, который должен оставаться как С++, но мне нужно хранить объекты objective-c в этих классах С++. Объекты не будут упоминаться нигде, пока они хранятся здесь, поэтому я не могу их удалить из-под меня. Перед ARC я просто сохранил их перед тем, как поместить их в класс С++, и автореализовал их, когда они были удалены. Все работало штрафы.
Но с ARC я не уверен, что делать. Делает ли переменные С++ __unsafe_unretained достаточно? Кажется, это не так, потому что, как только код obj-c больше не будет использовать эти объекты, он будет удален, или я не понимаю, что делает __unsafe_unretained. Могу ли я вызвать CFRetain() и CFAutorelase() в ARC?
Каков правильный способ борьбы с этим при ARC? Что делает NSArray глубоко, чтобы сохранить хранящиеся объекты?
Ответы
Ответ 1
Вы можете вызвать CFRetain и CFRelease в ARC. Вы несете ответственность за балансировку каждого CFRetain с CFRelease, потому что ARC не обращает внимания на эти функции.
Нет функции CFAutorelease. Вы можете выполнить авторекламу, используя objc_msgSend(myObject, sel_registerName("autorelease"))
. Обручи, которые вы прыгаете сюда, должны быть красным флагом, что вы делаете что-то, что, вероятно, неправильно.
Как правило, в ARC лучше найти способ не хранить ссылки на объекты в иначе-нетипизированных блоках памяти. Обратите внимание, что переменные-члены объектов С++ могут быть квалифицированы __strong
или __weak
, если вы скомпилируете их как Objective-C ++.
UPDATE
В общедоступных SDK Mac OS X 10.9 и iOS 7.0 есть функция CFAutorelease
, которую вы можете использовать даже в ARC.
Ответ 2
У меня был некоторый успех с использованием моста при преобразовании старого кода в Xcode 4.3. Это не позволяло мне моститься напрямую, но я смог преодолеть пустоту *. Я сделал это только для того, чтобы заставить работать какой-то старый код, поэтому я не могу гарантировать, что он работает отлично.
struct {
__unsafe_unretained UIView *view;
} blah;
...
blah = malloc(sizeof(blah));
...
// Cast the pointer with +1 to retain count
blah->view = (__bridge UIView *) (__bridge_retained void *) myView;
...
// blah->view can be used as normal
...
// Transfer ownership back to ARC for releasing
myView = (__bridge_transfer UIView *)(__bridge void *)blah->view;