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.

Firdous
sumber

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.

yuji
sumber
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