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

Interesting Posts

Проверка подлинности Google

Как определить относительный путь в java (Windows)

Настройка Wifi Router 'Region' – что это влияет? Мощность передачи?

Где найти Избранное в Google Chrome?

Интернационализация с угловым 4

JavaFX: «Инструментарий» не инициализируется при попытке воспроизведения mp3-файла с помощью classа MediaPlayer

Как сделать пейджинг в AngularJS?

Восстановление поврежденной файловой системы NTFS

Является ли a или aa неопределенным поведение, если a не инициализировано?

Ошибка жесткого диска? Не удается запустить CHKDSK. Восстановление?

Могу ли я подключить стереофонический линейный выход к линейке Mac для записи кассет?

Потерянные циклы на Intel? Несоответствие между rdtsc и CPU_CLK_UNHALTED.REF_TSC

Как проверить, существует ли файл в приложении Windows Store?

Наиболее эффективная библиотека примитивных библиотек Java

Как я могу поддерживать порядок ключей, которые я добавляю к hashу Perl?

Давайте будем гением компьютера.