Атрибути Objective-C, оголошені @property (неатомічні, копії, сильні, слабкі)


289

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



Відповіді:


559

Ця відповідь має численні помилки, а також застаріла. Будь ласка, дивіться інші питання / відповіді та коментарі.


Неатомний

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, навіть якщо ви все ще можете вказувати на нього, він буде розміщений з пам'яті.

Наведене вище посилання містить як хорошу інформацію щодо слабких, так і сильних.


1
якщо ви використовуєте цей NSString просто внутрішньо в цьому класі, ніж вам навіть не потрібна властивість, ви можете просто зробити його iVar, а якщо ви використовуєте його в іншому класі, ніж я раджу (сильний, копіювати).
Ankit Srivastava

1
Вам не вистачає властивості Assign.
mskw

10
nonatomicозначають, що до нього не можна одночасно звертатися декількома потоками. За замовчуванням це atomicробить його безпечним.
wcochran

1
Трохи турбує те, що зрештою цей час визначення неатомічного все ще неправильне і нагадує атомне. Цікаво, скільки людей використовували це за останні п’ять років і справили неправильне враження. Те, що сказав @wcochran, було правильним. неатомічний означає, що доступ до вказівника не обробляється атомно, і тому не є безпечним для потоків. Користь, як я розумію, це неатомічна полягає в тому, що вона легша за вагу.
Джон Бушнелл

1
Окрім коментаря @JohnBushnell, у цій відповіді є багато інших помилок та неточностей. Вона також не визріла, тому є дещо історичною. Подивіться в інше місце, якщо ви шукаєте відповіді на це питання.
CRD

45

nonatomic властивість констатує, що об'єкт не є безпечним для потоків, що означає, якщо інший потік намагається отримати доступ до цього об'єкта, ніж можуть трапитися погані речі, але це набагато швидше, ніж атомна властивість.

strongвикористовується з ARC, і це в основному допомагає вам, не турбуючись про кількість збережених об'єктів. ARC автоматично звільняє його для вас, коли ви закінчите з ним. Використання ключового слова strongозначає, що ви володієте об'єктом.

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

copyвластивість тут дуже добре пояснено

strong,weak,retain,copy,assignє взаємовиключними , так що ви не можете використовувати їх на одному об'єкті ... читати «Заявлені Властивості» розділ

сподіваючись, що це допоможе вам трохи вийти ...


чому сильні, слабкі, зберігають, копіюють, призначають взаємовиключні
vinoth.kumar

nonatomicлише означає, що не застосовується виключення. Це не означає, що доступ не є безпечним для потоків. Це деталь реалізації , що по atomicпорівнянні з nonatomicне захоплення.
bbum

@bbum Чи можете ви пояснити різницю між відсутністю виключення та безпечною темою ..?
Анкіт Срівастава

1
@AnkitSrivastava виключення - це коли потік A блокує потік B від проходження кодового шляху. Якщо цей шлях коду безпечний для виконання з декількох потоків, виключення не потрібно. Не безпечно для потоків означає, що шлях коду може дати невизначені результати, якщо A і B одночасно знижуються по ньому. Тобто виключення може використовуватися для того, щоб зробити щось безпечним для потоку, але безпека потоку не вимагає ексклюзивного виконання - без одночасного виконання.
bbum

17

Це посилання має розрив

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

Призначати означає, що __unsafe_unreished право власності.

копія передбачає __ сильне володіння, а також звичайну поведінку семантики копіювання на сетері.

утримування означає __ сильне володіння.

сильне означає __ сильне володіння.

unsafe_unreserved передбачає __unsafe_unreserved право власності.

слабкий має на увазі __ слабку власність.


чи властивість Assign не використовується лише для iVar та значень? То чому це небезпечно і чому потрібно зазначати, що воно не збережене?
mskw

9

Чудові відповіді! Одне, що я хотів би уточнити глибше, nonatomic/ atomic. Користувач повинен розуміти, що ця властивість - "atomicity" поширюється лише на посилання атрибута, а не на його вміст. Тобто atomicгарантуватиме атомність користувача для зчитування / встановлення вказівника та лише вказівника на атрибут. Наприклад:

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

У цьому випадку гарантується, що вказівник на dictволю буде прочитаний / заданий атомним способом різними потоками. АЛЕ dictсам по собі (словник, що dictвказує на), все ще небезпечний для потоку , тобто всі операції читання / додавання до словника все ще небезпечні для потоку.

Якщо вам потрібна безпечна колекція потоків, у вас є погана архітектура (частіше) АБО реальна вимога (рідше). Якщо це "справжня вимога" - вам слід знайти хороший і перевірений компонент для безпечного збору потоків, або бути готовим до випробувань і негараздів, написавши свій власний. В останньому випадку розглянемо парадигми "без замка", "без очікування". На перший погляд це схоже на ракетну науку, але може допомогти вам досягти фантастичних показників порівняно із "звичайним блокуванням".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.