Was ist der Unterschied zwischen 'schwach' und 'zuweisen' in der Delegate-Eigenschaftsdeklaration?

87

Was ist der Unterschied zwischen diesem:

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

und das:

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

Ich möchte Eigenschaft für Delegierte verwenden.

Firdous
quelle

Antworten:

153

Der einzige Unterschied zwischen weakund assignbesteht darin, dass weakder Wert des weakZeigers auf festgelegt wird, wenn das Objekt, auf das eine Eigenschaft zeigt, freigegeben wird nil, sodass Sie niemals das Risiko eingehen, auf Müll zuzugreifen. Wenn du benutztassign , geschieht dies nicht. Wenn das Objekt unter Ihnen freigegeben wird und Sie versuchen, darauf zuzugreifen, greifen Sie auf den Müll zu.

Wenn Sie sich für Objective-C-Objekte in einer Umgebung befinden, in der Sie sie verwenden können weak, sollten Sie sie verwenden.

Yuji
quelle
16
Wissen Sie, warum einige der Cocoa Touch-Framework-Klassen immer noch Assign für Delegierte verwenden? Beispielsweise wird der Delegat von UISearchDisplayController weiterhin zugewiesen. Warum wurde es nie aktualisiert?
Pwner
@Pwner sieht aus wie es in iOS 8.0
Stavash
Hier ist ein nicht-deprecated Beispiel: selbst UITableViewhat assignfür seine Delegierten:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet
3
@ChrisNolet Weil sie wahrscheinlich immer noch intern MRC (Manual Reference Counting) verwenden.
Marco Sero
2
Ab heute lautet das Beispiel für den Delegaten von UITableView: @property (nichtatomar, schwach, nullbar) id <UITableViewDelegate> delegate; Das ist also kein gültiges Beispiel mehr.
sdoowhsoj