Qual è la differenza tra "debole" e "assegnare" nella dichiarazione della proprietà del delegato


87

Qual è la differenza tra questo:

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

e questo:

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

Voglio usare la proprietà per i delegati.

Risposte:


153

L'unica differenza tra weake assignè che se l'oggetto a cui weakpunta una proprietà viene deallocato, il valore del weakpuntatore verrà impostato su nil, in modo da non correre mai il rischio di accedere a spazzatura. Se lo usi assign, ciò non accadrà, quindi se l'oggetto viene deallocato da sotto di te e provi ad accedervi, accederai alla spazzatura.

Per gli oggetti Objective-C, se ti trovi in ​​un ambiente in cui puoi usarlo weak, dovresti usarlo.


16
Sai perché alcune delle classi del framework Cocoa Touch usano ancora assign per i delegati? Ad esempio, il delegato di UISearchDisplayController è ancora assegnato. Perché non è mai stato aggiornato?
Pwner

@Pwner sembra che sia stato deprecato in iOS 8.0
Stavash

Ecco un esempio non deprecato: UITableViewha anche assignper il suo delegato:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet

3
@ChrisNolet Perché probabilmente stanno ancora usando MRC (Manual Reference Counting) internamente.
Marco Sero

2
Ad oggi, l'esempio del delegato di UITableView è ora: @property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate; Quindi questo non è più un esempio valido.
sdoowhsoj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.