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.

Firdous
la source

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.

yuji
la source
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