Я новачок у Obj-C, тому моє перше питання:
Які відмінності між strong
та weak
в @property
деклараціях покажчиків на об’єкти?
Також, що nonatomic
означає?
Я новачок у Obj-C, тому моє перше питання:
Які відмінності між strong
та weak
в @property
деклараціях покажчиків на об’єкти?
Також, що nonatomic
означає?
Відповіді:
Помітна посилання (яку ви будете використовувати в більшості випадків) означає, що ви хочете "володіти" об'єктом, на який ви посилаєтесь, з цією властивістю / змінною. Компілятор подбає про те, щоб будь-який об’єкт, який ви присвоїли цій властивості, не був знищений до тих пір, поки ви не будете вказувати на нього з посиланням. Лише після встановлення властивості nil
об'єкт буде знищений (якщо тільки один чи більше інших об'єктів також не мають на ньому сильної посилання).
Навпаки, зі слабкою посиланням ви означаєте, що не хочете мати контроль над життям об'єкта. Об'єкт, на який ви посилаєтесь, слабко живе лише тому, що принаймні один інший об'єкт має чітке посилання на нього. Як тільки це більше не відбувається, об’єкт руйнується, і ваше слабке властивість автоматично встановиться на nil
. Найбільш частими випадками використання слабких посилань на iOS є:
делегатні властивості, на які часто посилаються слабо, щоб уникнути збереження циклів, і
підпогляди / елементи управління основним видом контролера перегляду, оскільки ці погляди вже сильно утримуються головним видом.
атомний проти неатомних відноситься до безпеки потоку методів геттера та сеттера, який компілятор синтезує для властивості. atomic (за замовчуванням) вказує компілятору зробити способи accessor потокобезпечними (додавши блокування до доступу до ivar), а неатомічний робить навпаки. Перевага неатомічного - трохи більш висока продуктивність. На iOS Apple використовує неатомічну майже для всіх своїх властивостей, тому загальна порада для вас зробити те саме.
atomic
гарантує, що майно можна безпечно читати та записувати з декількох ниток одночасно. Це не означає, що об'єкт, властивості якого є всі atomic
, автоматично захищений потоками.
Можливо, буде корисно подумати про сильні та слабкі посилання з точки зору повітряних кульок.
Повітряна куля не злетить, поки щонайменше одна людина тримається за прикріплену до неї струну. Кількість людей, що тримають струни, - це кількість затримок. Коли ніхто не тримається за струну, балон відлетить (делолок). Багато людей можуть мати струни до тієї ж кулі. Ви можете отримати / встановити властивості та методи виклику на посилається об'єкт із сильними та слабкими посиланнями.
Важливе посилання є як би триматися за струну до цієї кулі. Поки ви тримаєтесь за струну, прикріплену до повітряної кулі, вона не злетить.
Слабка довідка - це як дивитися на повітряну кулю. Ви можете бачити це, отримувати доступ до його властивостей, називати це методами, але у вас немає рядка до цієї кулі. Якщо кожен, хто тримається за струну, відпускає повітряну кулю, і ви більше не можете отримати доступ до неї.
strong
і що weak
насправді означає.
strong : присвоює йому вхідне значення, воно збереже вхідне значення та звільнить існуюче значення змінної екземпляра
слабкий : призначить вхідне значення йому, не зберігаючи його.
Отже, основна відмінність - це збереження нової змінної. Як правило, ви хочете зберегти його, але є ситуації, коли ви не хочете його мати, інакше ви отримаєте цикл збереження і не можете звільнити пам'ять об'єктів. Напр. obj1 зберігає obj2 і obj2 зберігає obj1. Для вирішення подібної ситуації ви використовуєте слабкі посилання.
Фіктивна відповідь: -
Я думаю, що пояснення дано вище у відповіді, тому я просто розповім, де користуватися STRONG
та де використовувати WEAK
:
Використання Weak
: -
1. Делегатів 2. Торгових пунктів 3. Субвідеїв 4. Керування тощо.
Використання Strong
: -
Залишається всюди, в яку не входить WEAK
.
сильні та слабкі , ці ключові слова обертаються навколо власності на об'єкти в Objective-C
Що таке власність на об'єкт?
Змінні вказівники означають право власності на об'єкти, на які вони вказують.
У будь-який час змінна вказівника вказує на об’єкт, цей об’єкт має власника і залишатиметься живим. Це відоме як вагомий довідник.
Факультативна змінна не може брати право власності на об'єкт, на який вона вказує. Змінна, яка не приймає право власності на об'єкт, відома як слабка посилання.
Подивіться детальне пояснення тут. Демістифікація @ властивості та атрибутів
Тут Документація Apple пояснила різницю між слабкою та сильною властивістю, використовуючи різні приклади:
Ось, у цьому блозі автор зібрав усі властивості в одному місці. Це допоможе порівняти характеристики властивостей:
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
Для розуміння сильних і слабких посилань розглянемо нижче приклад, припустимо, у нас є метод, названий як displayLocalVariable.
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
}
У вищевказаному методі область змінної myView обмежена методом displayLocalVariable, як тільки метод закінчує змінну myView, яка містить об'єкт UIView, буде розміщена з пам'яті.
А що робити, якщо ми хочемо провести змінну myView протягом усього життєвого циклу контролера перегляду. Для цього ми можемо створити властивість з назвою usernameView, яка матиме чітке посилання на змінну myView (див. @property(nonatomic,strong) UIView* usernameView;
Та self.usernameView = myView;
внизу код), як нижче,
@interface LoginViewController ()
@property(nonatomic,strong) UIView* usernameView;
@property(nonatomic,weak) UIView* dummyNameView;
- (void)displayLocalVariable;
@end
@implementation LoginViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[self displayLocalVariable];
}
- (void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
Тепер у наведеному вище коді ви бачите, що myView призначено для self.usernameView, а self.usernameView має чітку посилання (як ми заявили в інтерфейсі за допомогою @property) на myView. Отже, myView не буде розміщений з пам'яті, поки self.usernameView не буде живим.
Тепер розглянемо призначення myName в dummyNameView, який є слабким посиланням, на self.dummyNameView = myView;
відміну від сильного посилання Слабкий буде тримати myView лише до тих пір, поки не буде сильної посилання на myView. Дивіться нижче код, щоб зрозуміти слабкий довідник,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.dummyNameView = myView;
}
У наведеному вище коді є слабке посилання на myView (тобто у self.dummyNameView є слабке посилання на myView), але немає сильної посилання на myView, отже, self.dummyNameView не зможе утримувати значення myView.
Тепер ще раз розглянемо наведений нижче код,
-(void)displayLocalVariable
{
UIView* myView = [[UIView alloc] init];
NSLog(@"myView tag is = %ld", myView.tag);
self.usernameView = myView;
self.dummyNameView = myView;
}
У наведеному вище коді self.usernameView має чітке посилання на myView, отже, self.dummyNameView тепер матиме значення myView навіть після закінчення методу, оскільки myView пов'язаний з ним сильним посиланням.
Тепер, коли ми робимо сильну посилання на змінну, її кількість підрахунків збільшується на одиницю, і змінна не буде розміщена доти, доки вона не збереже кількість до 0.
Сподіваюсь, це допомагає.
Сильний : В основному використовується з властивостями, які ми використовували для отримання або надсилання даних з / в інші класи. Слабкий : Зазвичай всі розетки, з'єднання мають слабкий тип від інтерфейсу.
Неатомний : такий тип властивостей використовується в умовах, коли ми не хочемо ділити нашу розетку чи об'єкт на різні одночасні теми. Іншими словами, неанатомічний екземпляр змушує наші властивості мати справу з однією ниткою одночасно. Сподіваємось, це корисно для вас.