Есть два новых атрибута управления памятью для свойств, представленных ARC, strong
и weak
.
Кроме того copy
, что, очевидно, является чем-то совершенно другим, есть ли различия между strong
против retain
и weak
против assign
?
Насколько я понимаю, единственное отличие здесь в том, что он weak
будет назначать nil
указатель, а assign
не будет, что означает, что программа завершится сбоем, когда я отправлю сообщение указателю после его освобождения. Но если я воспользуюсь weak
, этого никогда не произойдет, потому что отправка сообщения nil
не будет ничего делать.
Я не знаю никаких различий между strong
и retain
.
Есть ли какая-то причина, по которой я должен использовать assign
и retain
в новых проектах, или они устарели?
ios
objective-c
ios5
properties
automatic-ref-counting
Якуб Арнольд
источник
источник
strong
,weak
иunsafe_unretained
.weak
аstrong
) и 4 переменных отборочных прижизненной (__strong
,__weak
,__unsafe_unretained
,__autoreleasing
). Смотрите примечания ARC ниже.assign
при компиляции с ARC было ошибкой. Есть много удаленных ответов об этом. Похоже, что было изменено до финального релиза.unsafe_unretained
является предпочтительным атрибутом для многих из нас ранних последователей. Для доказательства того, чтоunsafe_unretained
этот атрибут является действительным, обратитесь к разделу «Программирование с помощью Objective-C» компании Apple в разделе «Инкапсуляция данных» в подзаголовке «Использовать небезопасные нераспределенные ссылки для некоторых классов». Что говорит: «Для свойства это означает использование атрибута unsafe_unretained:»Ответы:
Из заметок о переходе на ARC (пример в разделе об атрибутах свойств).
Так
strong
же, какretain
в объявлении свойства.Для проектов ARC я бы использовал
strong
вместоretain
, я использовал быassign
для примитивных свойств C иweak
для слабых ссылок на объекты Objective-C.источник
assign
для объекта. Вы должны использовать либоweak
илиunsafe_unretained
(что небезопасно, очевидно), если вы не хотите сохранять собственность.assign
компилируется для меня хорошо в проектах ARC с целью развертывания 4.0.retain
vs.strong
. Я предполагаю, что это в основном безвредно, но я предполагаю, что это должно бытьstrong
для последовательности ... или, возможно, это не имеет значения. stackoverflow.com/questions/7796476/…assign
в некоторых случаях все еще действует.Прочитав так много статей, опубликованных в Stackoverflow и демонстрационных приложениях для проверки атрибутов переменных, я решил собрать всю информацию об атрибутах:
Ниже приведена подробная ссылка на статью, где вы можете найти все вышеупомянутые атрибуты, которые определенно вам помогут. Большое спасибо всем людям, которые дают лучшие ответы здесь!
1. сильный (iOS4 = сохранить)
Пример:
2. слабый -
Пример :
Сильное и слабое объяснение, благодаря BJ Homer :
Когда мы используем слабые?
Единственный раз, когда вы захотите использовать слабый, - это если вы хотите избежать циклов сохранения (например, родитель сохраняет ребенка, а ребенок сохраняет родителя, поэтому ни один из них не освобождается).
3. сохранить = сильный
Пример:
4.assign
Пример:
источник
default
значит? Если я использую@property (nonatomic) NSString *string
этоstrong
? Илиassign
? Потому что оба по умолчанию.неатомический / атомный
сильный / слабый / правопреемник
(Необязательный)
копия
только для чтения
источник
Насколько я знаю,
strong
иretain
это синонимы, поэтому они точно делают же.Тогда
weak
он почти такой жеassign
, но автоматически устанавливается равным nil после того, как объект, на который он указывает, освобожден.Это означает, что вы можете просто заменить их.
Тем не менее , есть один особый случай, с которым я столкнулся, где я должен был использовать
assign
, а неweak
. Допустим, у нас есть два свойстваdelegateAssign
иdelegateWeak
. В обоих хранится наш делегат, который владеет нами, имея единственную сильную ссылку. Делегат освобождается, поэтому и наш-dealloc
метод тоже вызывается.Делегат уже находится в процессе освобождения, но еще не полностью освобожден. Проблема в том, что
weak
ссылки на него уже аннулированы! СвойствоdelegateWeak
содержит ноль, ноdelegateAssign
содержит действительный объект (все свойства уже освобождены и аннулированы, но все еще действительны).Это особый случай, но он показывает нам, как
weak
работают эти переменные и когда они обнуляются.источник
В документе Кланга об Objective-C Автоматический подсчет ссылок (ARC) четко разъясняются квалификаторы и модификаторы владения:
Тогда есть шесть модификаторов собственности для объявленной собственности:
В семантике квалификаторы владения имеют различное значение в пяти управляемых операциях : чтение, назначение, инициализация, уничтожение и перемещение, в которых в большинстве случаев мы заботимся только о разнице в операции назначения.
Другое различие в Чтении, Инициировании, Разрушении и Перемещении, пожалуйста, обратитесь к Разделу 4.2 Семантика в документе .
источник
Чтобы понять сильные и слабые ссылки, рассмотрим пример ниже. Предположим, у нас есть метод с именем displayLocalVariable.
В приведенном выше методе область действия переменной myName ограничена методом displayLocalVariable, как только метод завершится, переменная myName, содержащая строку «ABC», будет освобождена из памяти.
Теперь, что если мы хотим сохранить значение переменной myName на протяжении всего жизненного цикла контроллера представления. Для этого мы можем создать свойство с именем username, которое будет иметь ссылку Strong на переменную myName (см.
self.username = myName;
Код ниже), как показано ниже:Теперь в приведенном выше коде вы можете видеть, что myName было назначено для self.username, а self.username имеет сильную ссылку (как мы объявили в интерфейсе с использованием @property) на myName (косвенно это имеет сильную ссылку на строку «ABC»). Следовательно, строка myName не будет освобождена из памяти, пока self.username не станет активным.
Теперь рассмотрите возможность присвоения myName dummyName, который является слабой ссылкой, self.dummyName = myName; В отличие от Strong reference, Weak будет хранить myName только до тех пор, пока не будет Strong reference для myName. Посмотрите код ниже, чтобы понять слабую ссылку,
В приведенном выше коде есть Слабая ссылка на myName (т. Е. Self.dummyName имеет Слабую ссылку на myName), но нет строгой ссылки на myName, поэтому self.dummyName не сможет содержать значение myName.
Теперь снова рассмотрим приведенный ниже код,
В приведенном выше коде self.username имеет ссылку Strong на myName, поэтому self.dummyName теперь будет иметь значение myName даже после завершения метода, поскольку myName имеет ссылку Strong, связанную с ним.
Теперь всякий раз, когда мы делаем ссылку Strong на переменную, количество сохраняемых данных увеличивается на единицу, и переменная не освобождается, а количество сохраняемых данных достигает 0.
Надеюсь это поможет.
источник
Strong:
Пример: @property (сильный, неатомный) ViewController * viewController;
@synthesize viewController;
слабый
По умолчанию автоматически получить и установить на ноль
Пример: @property (слабый, неатомный) IBOutlet UIButton * myButton;
@synthesize myButton;
источник
Различия между сильным и сохранением:
Различия между слабым и назначаемым:
источник