Подтвердить что ты не робот

Сохранение объектов ARC в классах С++

У меня есть код, который должен оставаться как С++, но мне нужно хранить объекты objective-c в этих классах С++. Объекты не будут упоминаться нигде, пока они хранятся здесь, поэтому я не могу их удалить из-под меня. Перед ARC я просто сохранил их перед тем, как поместить их в класс С++, и автореализовал их, когда они были удалены. Все работало штрафы.

Но с ARC я не уверен, что делать. Делает ли переменные С++ __unsafe_unretained достаточно? Кажется, это не так, потому что, как только код obj-c больше не будет использовать эти объекты, он будет удален, или я не понимаю, что делает __unsafe_unretained. Могу ли я вызвать CFRetain() и CFAutorelase() в ARC?

Каков правильный способ борьбы с этим при ARC? Что делает NSArray глубоко, чтобы сохранить хранящиеся объекты?

4b9b3361

Ответ 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;