Сохранение объектов ARC в классах c ++ - PullRequest
13 голосов
/ 20 декабря 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 24 декабря 2011

У меня был некоторый успех при использовании моста при преобразовании старого кода в 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;
4 голосов
/ 20 декабря 2011

Вы можете позвонить в CFRetain и CFRelease под ARC.Вы несете ответственность за балансирование каждого CFRetain с CFRelease, поскольку ARC не обращает никакого внимания на эти функции.

Нет функции CFAutorelease.Вы можете выполнить авто-релиз, используя objc_msgSend(myObject, sel_registerName("autorelease")).Обручи, через которые вы прыгаете, должны быть красным флагом того, что вы делаете что-то, что, вероятно, неправильно.

Как правило, в ARC лучше найти способ не хранить ссылки на объекты в нетипизированных каплях памяти другого типа.Обратите внимание, что переменные-члены объектов C ++ могут быть квалифицированы __strong или __weak, если вы компилируете их как Objective-C ++.

UPDATE

Публичные SDK MacOS X 10.9 и iOS 7.0 включают функцию CFAutorelease, которую вы можете использовать даже в ARC.

...