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

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

Ответы [ 4 ]

557 голосов
/ 25 марта 2012

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

<Ч />

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

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

Копия

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

Присвоить

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

Сохраняйте

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

Strong

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

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

Слабое

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

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

45 голосов
/ 25 марта 2012

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

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

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

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

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

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

17 голосов
/ 25 марта 2012

Эта ссылка имеет разлом

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

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

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

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

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

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

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

9 голосов
/ 15 марта 2015

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

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

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

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

...