ARC-смысл небезопасного unretained?
просто хочу убедиться, что я все правильно понял:
- мне нужно
__unsafe_unretainобъекты, которые мне не принадлежат? - если объект
__unsafe_unretainedнужно ли мне использоватьassignна@property? Означает ли это, что объект не сохраняется, а просто относится к объекту, который я назначаю? - когда я хотел бы использовать его, кроме делегатов?
- это дуга вещь или она была в использовании раньше?
4 ответов:
компилятор LLVM 3.0 вводит четыре новых квалификатора владения:
__strong,__autoreleasing,__unsafe_unretainedи__weak. Первые три доступны даже за пределами дуги, согласно спецификация.как указывает Джошуа, по умолчанию все указатели подразумеваются как
__strongпод дуги. Это означает, что когда объект назначается этому указателю, он сохраняется до тех пор, пока этот указатель ссылается на него. Это прекрасно для большинства вещей, но это открывает возможность для сохраняйте циклы, как я описываю в своем ответе здесь. Например, если у вас есть объект, который содержит другой объект в качестве переменной экземпляра, но этот второй объект имеет сильную связь с первым в качестве его делегата, эти два объекта никогда не будут освобождены.именно по этой причине
__unsafe_unretainedи отбор. Их наиболее распространенное использование - для делегатов, где вы бы определили свойство для этого делегата с помощьюweakили (assignэффективноunsafe_unretained), а затем сопоставьте это, отметив соответствующую переменную экземпляра с__weakили__unsafe_unretained. Это означает, что переменная экземпляра делегата будет по-прежнему указывать на первый объект, но это не приведет к сохранению этого объекта, тем самым нарушая цикл сохранения и позволяя освобождать оба объекта.помимо делегатов, это полезно для разрыва любых других циклов сохранения, которые могут образоваться в вашем коде. Услужливо, прибор утечек теперь включает в себя представление циклов, в котором отображаются циклы сохранения, которые он обнаруживает в вашем приложении в графическом виде.
и
__unsafe_unretainedи__weakпредотвратить сохранение объектов, но немного по-другому. Ибо__weakуказатель на объект будет преобразован вnilоб освобождении объекта, на который он указывает, что является очень безопасным поведением. Как следует из названия,__unsafe_unretainedбудет продолжать держать в памяти, где был объект, даже после того, как он был освобожден. Это может привести к аварийно завершает работу из-за доступа к этому освобожденному объекту.зачем вам вообще использовать
__unsafe_unretainedпотом? К сожалению,__weakподдерживается только для iOS 5.0 и Lion в качестве целей развертывания. Если вы хотите вернуться к iOS 4.0 и Snow Leopard, вы должны использовать__unsafe_unretainedквалификатор, или использовать что-то типа MAZeroingWeakRef.
- нет, вы также можете использовать
weakдля объектов, которые вам не принадлежат.- нет, вы также можете использовать
unsafe_unretainedна имущество.- мое понимание заключается в том, что
unsafe_unretainedэлементы так же, какweak, без дополнительной безопасности очистки их, когда элемент, на который они указывают, освобождается (и накладные расходы, которые идут с ним).- это полностью дуга вещь.
__unsafe_unretainedсовпадает с тем, что хранение объекта по умолчанию было до ARC. С ARC значение по умолчанию теперь__strongозначает, что у вас есть ссылка на него, пока ваша ссылка не выйдет за рамки.
еще одно наблюдение на _ _ unsafe_unretained: у меня есть сбои в моем приложении на устройстве и не на тренажере с Иварс объявлены как __небезопасных_носителя! Да, это была ошибка в коде от Arc migration, но это был первый раз, когда я заметил такую разницу между устройством и симулятором.
Comments