Может кто-нибудь объяснить мне подробно, когда я должен использовать каждый атрибут: nonatomic
, copy
, strong
, weak
и т.д. для объявленного свойства и объяснить, что каждый делает? Какой-то пример был бы замечательным. Я использую ARC.
Objective-C объявлены атрибуты @property (неатомные, скопированные, сильные, слабые)
Ответ 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
) по-прежнему небезопасный поток, т.е. Все операции чтения/добавления в словарь по-прежнему небезопасны.
Если вам нужна потоковая безопасность, у вас либо есть плохая архитектура (чаще), либо реальное требование (реже). Если это "реальное требование", вы должны либо найти хороший, либо проверенный компонент сбора потоковой безопасности, либо быть готовым к испытаниям и несчастьям, которые пишут ваш собственный. В последнем случае рассмотрим парадигмы "без блокировки", "без ожидания". Похоже на ракетную науку с первого взгляда, но может помочь вам достичь фантастической производительности по сравнению с "обычной блокировкой".