Apa perbedaan antara 'weak' dan 'assign' dalam deklarasi properti delegasi


87

Apa perbedaan antara ini:

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

dan ini:

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

Saya ingin menggunakan properti untuk delegasi.

Jawaban:


153

Satu-satunya perbedaan antara weakdan assignadalah jika objek yang weakditunjuk oleh properti dibatalkan alokasinya, nilai weakpenunjuk akan disetel ke nil, sehingga Anda tidak akan pernah mengambil risiko mengakses sampah. Jika Anda menggunakan assign, itu tidak akan terjadi, jadi jika objek dialokasikan dari bawah Anda dan Anda mencoba mengaksesnya, Anda akan mengakses sampah.

Untuk objek Objective-C, jika Anda berada di lingkungan tempat Anda dapat menggunakannya weak, Anda harus menggunakannya.


16
Tahukah Anda mengapa beberapa kelas framework Cocoa Touch masih menggunakan tugas untuk delegasi? Misalnya, delegasi UISearchDisplayController masih ditetapkan. Mengapa itu tidak pernah diperbarui?
Pwner

@Pwner sepertinya sudah tidak digunakan lagi di iOS 8.0
Stavash

Berikut adalah contoh yang tidak berlaku lagi: even UITableViewmemiliki assignuntuk delegasinya:@property (nonatomic, assign) id <UITableViewDelegate> delegate;
Chris Nolet

3
@ChrisNolet Karena mungkin mereka masih menggunakan MRC (Manual Reference Counting) secara internal.
Marco Sero

2
Saat ini, contoh delegasi UITableView sekarang adalah: @property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate; Jadi itu bukan lagi contoh yang valid.
sdoowhsoj
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.