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


289

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



Ответы:


559

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


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

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

копия

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

Присвоить

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

сохранить

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

сильный

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

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

слабый

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

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


1
если вы используете эту NSString только для внутреннего использования в этом классе, то вам даже не нужно свойство, вы можете просто сделать его iVar, и если вы используете его в другом классе, чем я посоветую (сильный, копия).
Анкит Шривастава

1
Вам не хватает свойства Assign.
Mskw

10
nonatomicозначает, что к нему не должны обращаться одновременно несколько потоков. По умолчанию это atomicделает его потокобезопасным.
wcochran

1
Немного тревожно, что по прошествии всего этого времени определение неатома все еще неверно и напоминает атомное. Интересно, сколько людей использовали это за последние пять лет и получили неправильное впечатление. То, что @wcochran сказал, было правильно. nonatomic означает, что доступ к указателю не обрабатывается атомарно, и поэтому не является потокобезопасным. Я понимаю, что выгода от неатома заключается в том, что он легче.
Джон Бушнелл

1
В дополнение к комментарию @JohnBushnell в этом ответе есть много других ошибок и неточностей. Это также не в возрасте хорошо, так что немного исторический. Если вы ищете ответ на этот вопрос, посмотрите в другом месте.
CRD

45

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

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

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

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

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

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


почему сильные, слабые, сохраняют, копируют, присваивают взаимоисключающие
vinoth.kumar

nonatomicтолько означает, что исключение не применяется. Это не означает, что доступ не является потокобезопасным. Это деталь реализации, которую atomicvs. nonatomicне фиксирует.
bbum

@bbum Можете ли вы объяснить разницу между отсутствием исключения и безопасностью потоков?
Анкит Шривастава

1
Исключение @AnkitSrivastava - это когда поток A блокирует поток B от перехода по пути кода. Если этот путь к коду безопасен для выполнения из нескольких потоков, исключение не требуется. Не потокобезопасный означает, что путь к коду может давать неопределенные результаты, если A и B идут по нему одновременно. То есть исключение можно использовать для создания чего-то поточно-безопасного, но для обеспечения безопасности потока не требуется исключительное - не одновременное - выполнение.
bbum

17

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

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

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

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

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

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

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

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


свойство Assign используется только для iVar и значений? Так почему же это небезопасно и почему нужно отметить, что оно не сохраняется?
Mskw

9

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.