Відмінності між сильними та слабкими в Objective-C


308

Я новачок у Obj-C, тому моє перше питання:

Які відмінності між strongта weakв @propertyдеклараціях покажчиків на об’єкти?

Також, що nonatomicозначає?


19
насправді це хороші запитання, іноді ми забували, як основна концепція сильних / слабких та атомних / неатомних уподобань .... :) Дякую, що нагадали про це ...
andikurnia

10
@JackyBoy Що смішного полягає в тому, що запропонований простий пошук на Google приведе мене сюди хаха. #circularreference
Джейсон Ренальдо

10
Я схильний не довіряти багатьом відповідям на Google, але завжди посилаюся на
ТА

Відповіді:


641

Помітна посилання (яку ви будете використовувати в більшості випадків) означає, що ви хочете "володіти" об'єктом, на який ви посилаєтесь, з цією властивістю / змінною. Компілятор подбає про те, щоб будь-який об’єкт, який ви присвоїли цій властивості, не був знищений до тих пір, поки ви не будете вказувати на нього з посиланням. Лише після встановлення властивості nilоб'єкт буде знищений (якщо тільки один чи більше інших об'єктів також не мають на ньому сильної посилання).

Навпаки, зі слабкою посиланням ви означаєте, що не хочете мати контроль над життям об'єкта. Об'єкт, на який ви посилаєтесь, слабко живе лише тому, що принаймні один інший об'єкт має чітке посилання на нього. Як тільки це більше не відбувається, об’єкт руйнується, і ваше слабке властивість автоматично встановиться на nil. Найбільш частими випадками використання слабких посилань на iOS є:

  1. делегатні властивості, на які часто посилаються слабо, щоб уникнути збереження циклів, і

  2. підпогляди / елементи управління основним видом контролера перегляду, оскільки ці погляди вже сильно утримуються головним видом.

атомний проти неатомних відноситься до безпеки потоку методів геттера та сеттера, який компілятор синтезує для властивості. atomic (за замовчуванням) вказує компілятору зробити способи accessor потокобезпечними (додавши блокування до доступу до ivar), а неатомічний робить навпаки. Перевага неатомічного - трохи більш висока продуктивність. На iOS Apple використовує неатомічну майже для всіх своїх властивостей, тому загальна порада для вас зробити те саме.


28
@Bourne: Це залежить від того, що ви маєте на увазі під безпекою нитки. atomicгарантує, що майно можна безпечно читати та записувати з декількох ниток одночасно. Це не означає, що об'єкт, властивості якого є всі atomic, автоматично захищений потоками.
Оле Бегеманн

3
Чудові деталі. Я думаю, я цього не зрозумів досі. Дякую.
ahmedalkaff

1
Відповідно до документації на яблуко, атомна та неатомічна повинні бути синонімом безпеки ниток. developer.apple.com/library/ios/documentation/cocoa/conceptual/…
Муртаза Хуршед Хуссейн

5
"Примітка. Атомність властивості не є синонімом безпеки потоку об'єкта." developer.apple.com/library/ios/documentation/cocoa/conceptual/…
GS

чому ми просто не видалимо екземпляр, коли ми не хочемо? Чому ми не можемо просто вийняти повітря з повітряної кулі або знищити його, коли не хочемо, чому ми повинні дбати про прикріплені струни? Нам просто потрібні дані.
Ашиш Пісей

706

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

Повітряна куля не злетить, поки щонайменше одна людина тримається за прикріплену до неї струну. Кількість людей, що тримають струни, - це кількість затримок. Коли ніхто не тримається за струну, балон відлетить (делолок). Багато людей можуть мати струни до тієї ж кулі. Ви можете отримати / встановити властивості та методи виклику на посилається об'єкт із сильними та слабкими посиланнями.

Важливе посилання є як би триматися за струну до цієї кулі. Поки ви тримаєтесь за струну, прикріплену до повітряної кулі, вона не злетить.

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


68
+2 (якби тільки я міг). Серйозно, справді творче пояснення!
Con Antonakos

25
Після півтора років розвитку iOS, я думаю, що зараз я чітко зрозумів, що strongі що weakнасправді означає.
Ісуру

17
@ X.Li Цикл збереження - це те, що у вас є два рядки на балон, одна з них належить вам (значить, ви володієте цим балоном), а інша належить балону (значить, цей балон володіє вами). Оскільки у вас є лише доступ до вашої струни, як ви відпустите балон, якщо балон не хоче йти? Тож краще ти володієш балоном (сильним), поки балон не володіє тобою (слабким). Коли ви хочете відпустити його, просто
переріжте

5
Прочитайте його профіль, він інструктор з iOS. Дуже креативне пояснення !! Шапки Off :)
Hemang

3
Я думаю, що атомний та неатомарний можна охарактеризувати як громадську туалетну кімнату з декількома дверима, з одним туалетом у центрі. Як тільки хтось заходить в туалет через одну двері, він може також зачинити всі інші двері в туалет, якщо він не захоче відчути момент незручності. Лол. Дякую, що прочитали цю нісенітницю.
Чень Лі Йонг

24

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

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

Отже, основна відмінність - це збереження нової змінної. Як правило, ви хочете зберегти його, але є ситуації, коли ви не хочете його мати, інакше ви отримаєте цикл збереження і не можете звільнити пам'ять об'єктів. Напр. obj1 зберігає obj2 і obj2 зберігає obj1. Для вирішення подібної ситуації ви використовуєте слабкі посилання.


12

Фіктивна відповідь: -

Я думаю, що пояснення дано вище у відповіді, тому я просто розповім, де користуватися STRONGта де використовувати WEAK:

Використання Weak: - 1. Делегатів 2. Торгових пунктів 3. Субвідеїв 4. Керування тощо.

Використання Strong: - Залишається всюди, в яку не входить WEAK.


2
І що містить тощо: P
Rajneesh071,

3
webView, mapView тощо
shubham mishra

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

8

сильні та слабкі , ці ключові слова обертаються навколо власності на об'єкти в Objective-C

Що таке власність на об'єкт?

Змінні вказівники означають право власності на об'єкти, на які вони вказують.

  • Коли метод (або функція) має локальну змінну, яка вказує на об'єкт, вважається, що ця змінна володіє об'єктом, на який вказують.
  • Коли об'єкт має змінну екземпляра, яка вказує на інший об'єкт, говорить, що об'єкт із вказівником володіє об'єктом, на який вказують.

У будь-який час змінна вказівника вказує на об’єкт, цей об’єкт має власника і залишатиметься живим. Це відоме як вагомий довідник.

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

Подивіться детальне пояснення тут. Демістифікація @ властивості та атрибутів


6

Тут Документація Apple пояснила різницю між слабкою та сильною властивістю, використовуючи різні приклади:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3

Ось, у цьому блозі автор зібрав усі властивості в одному місці. Це допоможе порівняти характеристики властивостей:

http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html


6

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

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


2

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

Сподіваюсь, це допомагає.


2019-07-25 12: 33: 15.479002 + 0530 StrongAndWeak [6329: 245483] Мене звуть = ABC 2019-07-25 12: 33: 15.479226 + 0530 StrongAndWeak [6329: 245483] Мене звуть за сильний = ABC 2019- 07-25 12: 33: 15.479418 + 0530 StrongAndWeak [6329: 245483] Мене звуть слабке = ABC в цьому ви сказали, слабке властивість не має значення мого імені. Але я отримую значення мого імені як ABC для обох посилань .. ..? Чи можете ви дати більш чітку відповідь .... Дякую
заздалегідь

@Raviteja_DevObal ARC не обіцяє зробити це негайно (тобто розмістить рядок @ "ABC"), але згодом це дістанеться точно ...
Mahadev Mandale

@Raviteja_DevObal Як поясніть, тут рядки є поганим прикладом цього. Я оновив свою відповідь об’єктом UIView, сподіваюся, що це допоможе.
Mahadev Mandale

1

Сильний : В основному використовується з властивостями, які ми використовували для отримання або надсилання даних з / в інші класи. Слабкий : Зазвичай всі розетки, з'єднання мають слабкий тип від інтерфейсу.

Неатомний : такий тип властивостей використовується в умовах, коли ми не хочемо ділити нашу розетку чи об'єкт на різні одночасні теми. Іншими словами, неанатомічний екземпляр змушує наші властивості мати справу з однією ниткою одночасно. Сподіваємось, це корисно для вас.

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