Може хто - небудь пояснити мені докладно , коли я повинен використовувати кожен атрибут: nonatomic
, copy
, strong
, weak
, і так далі, для заявленого майна, і пояснити , що кожен робить? Якийсь приклад також був би чудовим. Я використовую ARC.
Може хто - небудь пояснити мені докладно , коли я повинен використовувати кожен атрибут: nonatomic
, copy
, strong
, weak
, і так далі, для заявленого майна, і пояснити , що кожен робить? Якийсь приклад також був би чудовим. Я використовую ARC.
Відповіді:
Ця відповідь має численні помилки, а також застаріла. Будь ласка, дивіться інші питання / відповіді та коментарі.
Неатомний
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, навіть якщо ви все ще можете вказувати на нього, він буде розміщений з пам'яті.
Наведене вище посилання містить як хорошу інформацію щодо слабких, так і сильних.
nonatomic
означають, що до нього не можна одночасно звертатися декількома потоками. За замовчуванням це atomic
робить його безпечним.
nonatomic
властивість констатує, що об'єкт не є безпечним для потоків, що означає, якщо інший потік намагається отримати доступ до цього об'єкта, ніж можуть трапитися погані речі, але це набагато швидше, ніж атомна властивість.
strong
використовується з ARC, і це в основному допомагає вам, не турбуючись про кількість збережених об'єктів. ARC автоматично звільняє його для вас, коли ви закінчите з ним. Використання ключового слова strong
означає, що ви володієте об'єктом.
weak
право власності означає, що ви не володієте ним, і воно просто відслідковує об'єкт до тих пір, поки об'єкт, якому він був призначений, залишається, як тільки другий об'єкт буде звільнений, він втрачає значення. Наприклад, наприклад. obj.a=objectB;
використовується і має слабке властивість, ніж його значення буде дійсним лише до тих пір, поки об'єктB не залишиться в пам'яті.
copy
властивість тут дуже добре пояснено
strong,weak,retain,copy,assign
є взаємовиключними , так що ви не можете використовувати їх на одному об'єкті ... читати «Заявлені Властивості» розділ
сподіваючись, що це допоможе вам трохи вийти ...
nonatomic
лише означає, що не застосовується виключення. Це не означає, що доступ не є безпечним для потоків. Це деталь реалізації , що по atomic
порівнянні з nonatomic
не захоплення.
Це посилання має розрив
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
Призначати означає, що __unsafe_unreished право власності.
копія передбачає __ сильне володіння, а також звичайну поведінку семантики копіювання на сетері.
утримування означає __ сильне володіння.
сильне означає __ сильне володіння.
unsafe_unreserved передбачає __unsafe_unreserved право власності.
слабкий має на увазі __ слабку власність.
Чудові відповіді! Одне, що я хотів би уточнити глибше, nonatomic
/ atomic
. Користувач повинен розуміти, що ця властивість - "atomicity" поширюється лише на посилання атрибута, а не на його вміст. Тобто atomic
гарантуватиме атомність користувача для зчитування / встановлення вказівника та лише вказівника на атрибут. Наприклад:
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
У цьому випадку гарантується, що вказівник на dict
волю буде прочитаний / заданий атомним способом різними потоками. АЛЕ dict
сам по собі (словник, що dict
вказує на), все ще небезпечний для потоку , тобто всі операції читання / додавання до словника все ще небезпечні для потоку.
Якщо вам потрібна безпечна колекція потоків, у вас є погана архітектура (частіше) АБО реальна вимога (рідше). Якщо це "справжня вимога" - вам слід знайти хороший і перевірений компонент для безпечного збору потоків, або бути готовим до випробувань і негараздів, написавши свій власний. В останньому випадку розглянемо парадигми "без замка", "без очікування". На перший погляд це схоже на ракетну науку, але може допомогти вам досягти фантастичних показників порівняно із "звичайним блокуванням".