Jaka jest różnica między „słabym” a „przypisanym” w deklaracji właściwości delegata

87

Jaka jest różnica między tym:

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

i to:

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

Chcę użyć właściwości dla delegatów.

Dziwny
źródło

Odpowiedzi:

153

Jedyna różnica między weaki assignpolega na tym, że jeśli obiekt, na który weakwskazuje właściwość, zostanie zwolniony, wówczas wartość weakwskaźnika zostanie ustawiona na nil, dzięki czemu nigdy nie ryzykujesz dostępu do śmieci. Jeśli użyjesz assign, to się nie stanie, więc jeśli obiekt zostanie zwolniony spod ciebie i spróbujesz uzyskać do niego dostęp, uzyskasz dostęp do śmieci.

W przypadku obiektów Objective-C, jeśli jesteś w środowisku, w którym możesz użyć weak, powinieneś go użyć.

yuji
źródło
16
Czy wiesz, dlaczego niektóre klasy struktury Cocoa Touch nadal używają przypisania dla delegatów? Na przykład delegat UISearchDisplayController jest nadal przypisywany. Dlaczego nigdy nie był aktualizowany?
Pwner,
@Pwner wygląda na to, że został wycofany w iOS 8.0
Stavash
Oto przykład, który nie został uznany za przestarzały: UITableViewma nawet assigndla swojego delegata:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet
3
@ChrisNolet Ponieważ prawdopodobnie nadal używają MRC (ręcznego liczenia referencji) wewnętrznie.
Marco Sero
2
Na dzień dzisiejszy przykładem delegata UITableView jest teraz: @property (nonatomic, słaby, nullable) id <UITableViewDelegate> delegat; Więc to nie jest już prawidłowy przykład.
sdoowhsoj