Объявленные в Objective-C атрибуты @property (неатомные, копируемые, сильные, слабые)

Может кто-нибудь объяснить мне подробно, когда я должен использовать каждый атрибут: nonatomic, copy, strong, weakи так далее, для объявленного свойства, и объясните, что каждый из них делает? Какой-то пример тоже подойдет. Я использую ARC.

4 ответа

Решение

Этот ответ имеет множество ошибок и также устарел. Пожалуйста, смотрите другие вопросы / ответы и комментарии.


неатомической

nonatomic используется для многопоточности. Если мы установили неатомарный атрибут во время объявления, тогда любой другой поток, желающий получить доступ к этому объекту, может получить к нему доступ и дать результаты в отношении многопоточности.

копия

copy требуется, когда объект изменчив. Используйте это, если вам нужно, чтобы значение объекта было таким, как оно есть в данный момент, и вы не хотите, чтобы это значение отражало какие-либо изменения, сделанные другими владельцами объекта. Вам нужно будет освободить объект, когда вы закончите с ним, потому что вы сохраняете копию.

приписывать

Assign является чем-то противоположным copy, При вызове получателя assign свойство, оно возвращает ссылку на фактические данные. Обычно вы используете этот атрибут, когда у вас есть свойство примитивного типа (float, int, BOOL...)

сохранить

retain требуется, когда атрибут является указателем на объект. Сеттер, сгенерированный @synthesize сохранит (или добавит счетчик сохранения) объект. Вам нужно будет отпустить объект, когда вы закончите с ним. Использование retain увеличивает количество сохраняемых данных и занимает память в пуле автоматического выпуска.

сильный

strong является заменой для атрибута сохранения, как часть Objective-C Automated Reference Counting (ARC). В не-ARC-коде это просто синоним для сохранения.

Это хороший сайт, чтобы узнать о strong а также weak для iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

слабый

weak похож на strong за исключением того, что он не увеличит количество ссылок на 1. Он не становится владельцем этого объекта, а просто хранит ссылку на него. Если счетчик ссылок объекта падает до 0, даже если вы все еще указываете на него здесь, он будет освобожден из памяти.

Приведенная выше ссылка содержит как Хорошую информацию о Слабых, так и Сильных.

nonatomic Свойство заявляет, что объект не является потокобезопасным, что означает, что если другой поток пытается получить доступ к этому объекту, могут произойти плохие вещи, но это намного быстрее, чем атомарное свойство.

strong используется с ARC, и это в основном помогает вам, не беспокоясь о сохранении счета объекта. ARC автоматически выпускает его для вас, когда вы закончите. Использование ключевого слова strong означает, что вы владеете объектом.

weak владение означает, что вы не являетесь его владельцем, и он просто отслеживает объект до тех пор, пока объект, которому он был назначен, не останется, как только второй объект будет выпущен, он теряет свою ценность. Например, obj.a=objectB; используется и имеет слабое свойство, тогда его значение будет действительным только до тех пор, пока objectB не останется в памяти.

copy свойство очень хорошо объяснено здесь

strong,weak,retain,copy,assign являются взаимоисключающими, поэтому вы не можете использовать их на одном объекте... прочитайте раздел "Объявленные свойства"

надеясь, что это поможет вам немного...

Эта ссылка сломана

http://clang.llvm.org/docs/AutomaticReferenceCounting.html

Назначение подразумевает __unsafe_unretained владение.

Копирование подразумевает __сильное владение, а также обычное поведение семантики копирования в установщике.

сохранить подразумевает __сильное владение.

сильный подразумевает __сильное владение.

unsafe_unretained подразумевает __unsafe_unretained владение.

слабое подразумевает слабое владение.

Отличные ответы! Одна вещь, которую я хотел бы уточнить, это nonatomic/atomic, Пользователь должен понимать, что это свойство - "атомарность" распространяется только на ссылку атрибута, а не на его содержимое. Т.е. atomic будет гарантировать атомарность пользователя для чтения / установки указателя и только указатель на атрибут. Например:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

В этом случае гарантируется, что указатель на dict будет прочитан / установлен атомарным способом различными потоками. Но dict сам (словарь dict указание на) по-прежнему является потокобезопасным, то есть все операции чтения / добавления в словарь по-прежнему потокобезопасны.

Если вам нужен потокобезопасный сбор, у вас либо плохая архитектура (чаще), либо реальное требование (более редко). Если это "реальное требование" - вы должны либо найти хороший и проверенный потокобезопасный компонент для сбора, либо быть готовым к испытаниям и испытаниям, написав свой собственный. В последнем случае рассмотрим парадигмы "без блокировки" и "без ожидания". На первый взгляд, это похоже на науку о ракетостроении, но может помочь вам добиться фантастической производительности по сравнению с "обычной блокировкой".

Другие вопросы по тегам