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

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

Ответ 1

Этот ответ имеет многочисленные ошибки и также устарел. См. Другие вопросы/ответы и комментарии.


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

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

копия

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

приписывать

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

сохранить

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

сильный

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

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

слабый

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

В приведенной выше ссылке содержатся как хорошие сведения о слабых, так и сильных.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

copy подразумевает __strong собственность, а также обычное поведение копии семантика на сеттер.

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

strong подразумевает __strong собственность.

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

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

Ответ 4

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

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

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

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