Quelle est la différence entre 'faible' et 'assign' dans la déclaration de propriété déléguée


87

Quelle est la différence entre ceci:

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

et ça:

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

Je souhaite utiliser la propriété pour les délégués.

Réponses:


153

La seule différence entre weaket assignest que si l'objet vers lequel weakpointe une propriété est désalloué, la valeur du weakpointeur sera définie sur nil, de sorte que vous ne couriez jamais le risque d'accéder à des déchets. Si vous utilisez assign, cela ne se produira pas, donc si l'objet est désalloué sous vous et que vous essayez d'y accéder, vous accéderez aux déchets.

Pour les objets Objective-C, si vous êtes dans un environnement où vous pouvez les utiliser weak, vous devez les utiliser.


16
Savez-vous pourquoi certaines des classes du framework Cocoa Touch utilisent encore assign pour les délégués? Par exemple, le délégué de UISearchDisplayController est toujours assigné. Pourquoi n'a-t-il jamais été mis à jour?
Pwner

@Pwner semble être obsolète dans iOS 8.0
Stavash

Voici un exemple non désapprouvée: même UITableViewa assignpour son délégué:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet

3
@ChrisNolet Parce qu'ils utilisent probablement encore MRC (Manual Reference Counting) en interne.
Marco Sero

2
À partir d'aujourd'hui, l'exemple du délégué de UITableView est maintenant: @property (nonatomic, faible, nullable) id <UITableViewDelegate> délégué; Ce n'est donc plus un exemple valable.
sdoowhsoj
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.