Яка різниця між "слабким" та "присвоїти" в декларації властивості делегата


87

У чому різниця між цим:

@property (nonatomic, weak) id  <SubClassDelegate> delegate; 

і це:

@property (nonatomic, assign) id  <SubClassDelegate> delegate; 

Я хочу використовувати власність для делегатів.

Відповіді:


153

Єдина відмінність між weakта assignполягає в тому, що якщо об’єкт, на який weakвказує властивість, вивільнений, тоді значення weakпокажчика буде встановлено на nil, так що ви ніколи не ризикуєте отримати доступ до сміття. Якщо ви використовуєте assign, цього не станеться, тому, якщо об’єкт буде виведено з-під вас, і ви спробуєте отримати до нього доступ, ви отримаєте доступ до сміття.

Для об’єктів Objective-C, якщо ви перебуваєте в середовищі, де ви можете використовувати weak, то вам слід використовувати його.


16
Чи знаєте ви, чому деякі рамкові класи Cocoa Touch досі використовують призначення для делегатів? Наприклад, делегат UISearchDisplayController все ще призначений. Чому його ніколи не оновлювали?
Pwner

@Pwner схоже на те, що він застарів у iOS 8.0
Ставаш,

Ось , не постарілого приклад: навіть UITableViewмає assignсвій делегат:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Кріс Nolet

3
@ChrisNolet, оскільки, ймовірно, вони все ще використовують MRC (ручний підрахунок посилань) всередині.
Марко Серо,

2
На сьогоднішній день прикладом делегата UITableView є: @property (неатомний, слабкий, що допускає нуль) делегат <UITableViewDelegate>; Тож це вже не слушний приклад.
sdoowhsoj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.