Як хтось, що є новим у Objective-C, може хтось подати мені огляд збереження, присвоєння, копіювання та будь-яких інших, які я відсутні, які відповідають директиві @property? Що вони роблять і чому я хочу використовувати один над іншим?
Як хтось, що є новим у Objective-C, може хтось подати мені огляд збереження, присвоєння, копіювання та будь-яких інших, які я відсутні, які відповідають директиві @property? Що вони роблять і чому я хочу використовувати один над іншим?
Відповіді:
Стаття, на яку посилається MrMage, більше не працює. Отже, ось що я дізнався за своїм (дуже) коротким часом кодування в Objective-C:
неатомічний та атомний - за замовчуванням "атомний". Завжди використовуйте "неатомічний". Я не знаю чому, але в книзі, яку я прочитав, було сказано, що "рідко є причина" використовувати "атомну". (BTW: Книга, яку я читав, - це книга BNR "Програмування iOS".)
readwrite vs. readonly - за замовчуванням "readwrite". Коли ви @synthesize, для вас будуть створені і геттер, і сетер. Якщо ви використовуєте "тільки для читання", жоден сетер не буде створений. Використовуйте його для значення, яке ви не хочете ніколи змінювати після встановлення об'єкта.
зберегти проти копіювання проти присвоїти
atomic
так само погано, як і порадити nonatomic
. Жоден вибір не є "правильним", тому мовні дизайнери вибрали безпечніше двох рішень. Насправді nonatomic
це найкращий вибір, оскільки він упускає надзвичайно дорогі замки з нитками. Єдиною причиною використання atomic
є те, якщо ваше майно може бути встановлено з декількох потоків (у такому випадку його пропуск може призвести до надмірного випуску або витоку).
Перш ніж дізнатися про атрибути @property, слід знати, у чому полягає використання @property.
@property пропонує спосіб визначити інформацію, яку призначений для інкапсуляції класу. Якщо ви оголосите об’єкт / змінну за допомогою @property , то цей об'єкт / змінна буде доступна для інших класів, що імпортують його клас.
Якщо ви оголошуєте об'єкт за допомогою @property у файлі заголовка, вам доведеться його синтезувати за допомогою @synthesize у файлі реалізації. Це робить об'єкт KVC сумісним . За замовчуванням компілятор синтезує методи аксесуарів для цього об’єкта.
Методами аксесуарів є: сетер та геттер.
Приклад: .h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
.m
@implementation XYZClass
@synthesize name;
@end
Тепер компілятор буде синтезувати методи доступу до імені .
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Список атрибутів @property
атомний, неатомний, зберегти, скопіювати, лише для читання, перечитати, призначити, сильний, getter = метод, setter = метод, небезпечний_незахищений
атомний - це поведінка за замовчуванням. Якщо об’єкт оголошений атомним, він стає безпечним для потоків. Захист потоку означає, що за часом лише одна нитка певного екземпляра цього класу може мати контроль над цим об'єктом.
Якщо потік виконує метод getter, то інший потік не може виконати метод setter на цьому об'єкті. Це повільно.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
З цієї причини швидше отримати доступ до неатомної властивості, ніж до атомного.
@property (nonatomic)NSString *name;
Метод setter збільшить кількість збережених об'єктів, щоб він зайняв пам'ять в пулі автовипуску.
@property (retain)NSString *name;
Навіть якщо встановлена змінна рядок і згодом її змінено, екземпляр фіксує будь-яке значення, яке воно має на момент встановлення. Жодні методи сеттера та геттера не будуть синтезовані.
@property (copy) NSString *name;
тепер,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
ім’я не зміниться.
Компілятор генерує геттер, але не сетер.
@property (readonly) NSString *name;
Це протилежне лише читання.
@property (readwrite) NSString *name;
Пам’ятайте, що утримування та призначення є в основному взаємозамінними, коли ввімкнено збирання сміття.
@property (assign) NSInteger year;
Він поставляється з ARC.
@property (nonatomic, strong) AVPlayer *player;
У випадку булевих властивостей (властивості, які мають значення YES або NO), метод getter починається зі слова "є"
@property (getter=isFinished) BOOL finished;
Метод повинен закінчуватися двокрапкою.
@property(setter = boolBool:) BOOL finished;
Небезпечна посилання схожа на слабку посилання тим, що вона не підтримує пов'язаний об’єкт живим, але він не буде встановлений на нуль, якщо об'єкт призначення буде розміщений.
@property (unsafe_unretained) NSObject *unsafeProperty;
Якщо вам потрібно вказати кілька атрибутів, просто включіть їх як список, розділений комами, як-от так:
@property (readonly, getter=isFinished) BOOL finished;
@property
в заголовки, то ви повинні синтезувати його , використовуючи @synthesize
в файлі реалізації.» Не завжди. Наприклад, "За замовчуванням readwrite
властивість буде підтримуватися змінною екземпляра, яка знову буде автоматично синтезована компілятором." Від док .
Прочитавши багато статей, я вирішив зібрати всю інформацію про атрибути:
- атомний // за замовчуванням
- неатомічний
- strong = зберегти // за замовчуванням
- слабкий = небезпечний
- зберегти
- призначити // за замовчуванням
- небезпечно
- копія
- лише для читання
- readwrite // за замовчуванням
Нижче наводиться посилання на детальну статтю, де ви можете знайти ці атрибути.
Велике спасибі всім людям, які дають найкращі відповіді тут !!
Ось зразковий опис із статті
Приклад:
@property (retain) NSString *name;
@synthesize name;
Приклад:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Поясніть:
Припустимо, є властивість атомного рядка під назвою "ім'я", і якщо ви називаєте [self setName: @ "A"] з потоку A, зателефонуйте [self setName: @ "B"] з потоку B, а виклик [self name] з нитка C, тоді всі операції над різною ниткою будуть виконуватися послідовно, тобто якщо один потік виконує сеттер або геттер, то інші потоки будуть чекати. Це робить властивість "name" для читання / запису властивості безпечною, але якщо інший потік D викликає [випуск імені] одночасно, ця операція може призвести до збоїв, оскільки тут не задіяний виклик сеттера / геттера. Що означає, що об'єкт є безпечним для читання / запису (ATOMIC), але не є безпечним для потоків, оскільки інші потоки можуть одночасно надсилати об'єкту будь-який тип повідомлень. Розробник повинен забезпечити безпеку ниток для таких об’єктів.
Якщо властивість "name" була неатомічною, то всі потоки в наведеному вище прикладі - A, B, C і D будуть виконуватися одночасно, створюючи будь-який непередбачуваний результат. У разі атомного, будь-який з A, B або C виконає спочатку, але D все ще може виконуватися паралельно.
Приклад:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Приклад:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Сильне і слабке пояснення, завдяки BJ Homer :
Уявіть, наш об’єкт - собака, і що собака хоче втекти (бути розселеною). Сильні покажчики - як повідок на собаці. Поки ви прив’язуєте повідку до собаки, собака не втече. Якщо п’ять людей прив’язують повідку до однієї собаки, (п’ять сильних вказівників на один об’єкт), то собака не втече, поки всі п’ять повідців не від'єднаються. З іншого боку, слабкі вказівники - це як маленькі діти, що вказують на собаку і говорять: "Дивись! Собака!" Поки собака все ще на повідку, маленькі діти ще можуть побачити собаку, і вони все одно вкажуть на неї. Як тільки всі повідці відриваються, собака тікає незалежно від того, скільки маленьких діток на неї вказують. Як тільки останній сильний покажчик (повідок) більше не вказує на об’єкт, об’єкт буде розміщений, і всі слабкі покажчики будуть нульовими. Коли ми використовуємо слабкі? Єдиний раз, коли ви хочете використовувати слабкі, це якщо ви хочете уникнути циклів утримування (наприклад, батько зберігає дитину, а дитина зберігає батьків, тому жоден з них не звільняється).
Приклад:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Приклад:
@property (nonatomic, assign) NSString *address;
@synthesize address;
небезпечно
-unsafe_unretain - це кваліфікатор права власності, який повідомляє ARC, як вставляти виклики утримувати / звільняти -unsafe_unretain - це версія ARC присвоєння.
Приклад:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Приклад:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
Атомна властивість може бути доступна одночасно лише однією ниткою. Це безпечно для ниток . За замовчуванням - атомний. Зауважте, що немає ключового слова атомний
Неатомне означає, що кілька елементів можуть отримати доступ до елемента. Це так нитка небезпечна
Тому слід бути дуже обережним під час використання атомних. Як це впливає на продуктивність вашого коду
віддайте перевагу цим посиланням щодо властивостей у object-c в iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html