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.

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ć.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.