ARC-смысл небезопасного unretained?



просто хочу убедиться, что я все правильно понял:




  1. мне нужно __unsafe_unretain объекты, которые мне не принадлежат?

  2. если объект __unsafe_unretained нужно ли мне использовать assign на @property? Означает ли это, что объект не сохраняется, а просто относится к объекту, который я назначаю?

  3. когда я хотел бы использовать его, кроме делегатов?

  4. это дуга вещь или она была в использовании раньше?

591   4  

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.

  1. нет, вы также можете использовать weak для объектов, которые вам не принадлежат.
  2. нет, вы также можете использовать unsafe_unretained на имущество.
  3. мое понимание заключается в том, что unsafe_unretained элементы так же, как weak, без дополнительной безопасности очистки их, когда элемент, на который они указывают, освобождается (и накладные расходы, которые идут с ним).
  4. это полностью дуга вещь.

__unsafe_unretained совпадает с тем, что хранение объекта по умолчанию было до ARC. С ARC значение по умолчанию теперь __strong означает, что у вас есть ссылка на него, пока ваша ссылка не выйдет за рамки.

еще одно наблюдение на _ _ unsafe_unretained: у меня есть сбои в моем приложении на устройстве и не на тренажере с Иварс объявлены как __небезопасных_носителя! Да, это была ошибка в коде от Arc migration, но это был первый раз, когда я заметил такую разницу между устройством и симулятором.

Comments

    Ничего не найдено.