Может кто - нибудь объяснить мне подробно , когда я должен использовать каждый атрибут: nonatomic
, copy
, strong
, weak
, и так далее, для заявленного имущества, и объяснить , что каждый делает? Какой-то пример тоже подойдет. Я использую ARC.
objective-c
automatic-ref-counting
declared-property
Gaurav_soni
источник
источник
Ответы:
Этот ответ имеет множество ошибок и также устарел. Пожалуйста, смотрите другие вопросы / ответы и комментарии.
неатомической
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, хотя вы все еще можете указывать на него здесь, он будет освобожден из памяти.Приведенная выше ссылка содержит как полезную, так и слабую информацию .
источник
nonatomic
означает, что к нему не должны обращаться одновременно несколько потоков. По умолчанию этоatomic
делает его потокобезопасным.nonatomic
Свойство утверждает, что объект не является потокобезопасным, что означает, что если другой поток пытается получить доступ к этому объекту, это может привести к плохим вещам, но это намного быстрее, чем атомарное свойство.strong
используется с ARC, и это в основном помогает вам, не беспокоясь о сохранении счета объекта. ARC автоматически выпускает его для вас, когда вы закончите. Использование ключевого словаstrong
означает, что вы являетесь владельцем объекта.weak
владение означает, что вы не владеете им, и он просто отслеживает объект до тех пор, пока объект, которому он был назначен, не останется, как только будет выпущен второй объект, он теряет свою ценность. Например,obj.a=objectB;
используется и имеет слабое свойство, тогда его значение будет действительным только до тех пор, пока objectB не останется в памяти.copy
свойство очень хорошо объяснено здесьstrong,weak,retain,copy,assign
являются взаимоисключающими, поэтому вы не можете использовать их на одном объекте ... прочитайте раздел «Объявленные свойства»надеясь, что это поможет вам немного ...
источник
nonatomic
только означает, что исключение не применяется. Это не означает, что доступ не является потокобезопасным. Это деталь реализации, которуюatomic
vs.nonatomic
не фиксирует.Эта ссылка сломана
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
источник
Отличные ответы! Одна вещь, которую я хотел бы уточнить, это
nonatomic
/atomic
. Пользователь должен понимать, что это свойство - «атомарность» распространяется только на ссылку атрибута, а не на его содержимое. Т.е.atomic
гарантируется атомарность пользователя для чтения / установки указателя и только указателя на атрибут. Например:В этом случае гарантируется, что указатель на
dict
будет читаться / устанавливаться атомарным способом различными потоками. НОdict
сам по себе (словарьdict
указывает на) по-прежнему потокобезопасным , то есть все операции чтения / добавления в словарь по-прежнему поток небезопасно.Если вам нужен потокобезопасный сбор, у вас либо плохая архитектура (чаще), либо реальное требование (более редко). Если это «реальное требование» - вы должны либо найти хороший и проверенный потокобезопасный компонент для сбора, либо быть готовым к испытаниям и невзгодам, написав свой собственный. В последнем случае рассмотрим парадигмы «без блокировки» и «без ожидания». На первый взгляд это похоже на ракетостроение, но может помочь вам добиться фантастических результатов по сравнению с «обычной блокировкой».
источник