Objective-C объявлены атрибуты @property (неатомные, скопированные, сильные, слабые)
Может ли кто-нибудь объяснить мне подробно, когда я должен использовать каждый атрибут: nonatomic
, copy
, strong
, weak
и т. Д., Для объявленного свойства и объяснить, что каждый делает? Какой-то пример был бы замечательным. Я использую ARC.
Этот ответ имеет многочисленные ошибки и также устарел. См. Другие вопросы / ответы и комментарии.
неатомической
nonatomic
используется для многопоточности. Если мы установили неатомический атрибут во время объявления, то любой другой stream, желающий получить доступ к этому объекту, может получить к нему доступ и дать результаты в отношении многопоточности.
копия
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, хотя вы все равно можете указывать на него здесь, он будет освобожден из памяти.
В приведенной выше ссылке содержатся как хорошие сведения о слабых, так и сильных.
nonatomic
свойство утверждает, что объект не является streamобезопасным, что означает, что другой stream пытается получить доступ к этому объекту, чем могут произойти плохие вещи, но это намного быстрее, чем атомное свойство.
strong
используется с ARC, и это в основном помогает вам, не беспокоясь о сохранении количества объекта. ARC автоматически освобождает его для вас, когда вы закончите с ним. Использование ключевого слова strong
означает, что вы владеете объектом.
weak
владение означает, что вы не владеете им, и оно просто отслеживает объект до тех пор, пока объект, которому он был назначен, останется, как только второй объект будет выпущен, он потеряет значение. Напр. obj.a=objectB;
и a имеет слабое свойство, чем его значение будет действительным только до тех пор, пока объект B не останется в памяти.
свойство copy
очень хорошо объяснено здесь
strong,weak,retain,copy,assign
, взаимно исключают, поэтому вы не можете использовать их на одном объекте … прочитайте раздел «Объявленные свойства»
надеясь, что это поможет вам немного …
Эта ссылка имеет разрыв
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
присваивание подразумевает __unsafe_unretained право собственности.
копия подразумевает владение __strong, а также обычное поведение семантики копирования на сеттере.
сохранение подразумевает владение __strong.
сильный подразумевает __strong собственность.
unsafe_unretained подразумевает __unsafe_unretained право собственности.
слабый подразумевает владение __weak.
Отличные ответы! Одна вещь, которую я хотел бы прояснить глубже, – это nonatomic
/ atomic
. Пользователь должен понимать, что это свойство – «атомарность» распространяется только на ссылку атрибута, а не на его содержимое. Т.е. atomic
будет гарантировать атомарность пользователя для чтения / установки указателя и только указателя на атрибут. Например:
@interface MyClass: NSObject @property (atomic, strong) NSDictionary *dict; ...
В этом случае гарантируется, что указатель на dict
будет читаться / задаваться атомарным образом различными streamами. НО сам dict
(указатель словаря, указывающий на) по-прежнему небезопасен , т.е. все операции чтения / добавления в словарь по-прежнему являются небезопасными.
Если вам нужна streamовая безопасность, у вас либо есть плохая архитектура (чаще), либо реальное требование (реже). Если это «реальное требование», вы должны либо найти хороший и проверенный нитебезопасный компонент сбора, либо быть готовым к испытаниям и невзгодам, написав свой собственный. В последнем случае рассмотрим парадигмы «без блокировки», «без ожидания». Похоже, ракетная наука на первый взгляд, но может помочь вам достичь фантастической производительности по сравнению с «обычной блокировкой».