В чем разница между 'weak' и 'assign' в объявлении свойства делегата


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 07

@Pwner выглядит устаревшим в iOS 8.0
Ставаш 01

Вот UITableViewassign@property (nonatomic, assign) id <UITableViewDelegate> delegate;
нерекомендуемый

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

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