Saya mencoba menyelesaikan teka-teki.
__strongadalah default untuk semua penunjuk objek yang dapat dipertahankan Objective-C seperti NSObject, NSString, dll. Ini adalah referensi yang kuat. ARC menyeimbangkannya dengan a -releasedi akhir ruang lingkup.
__unsafe_unretainedsama dengan cara lama. Ini digunakan untuk penunjuk yang lemah tanpa mempertahankan objek yang dapat dipertahankan.
__weakseperti __unsafe_unretainedkecuali bahwa itu adalah referensi lemah auto-zeroing yang berarti bahwa penunjuk akan disetel ke nol segera setelah objek yang direferensikan dibatalkan alokasinya. Ini menghilangkan bahaya petunjuk yang menggantung dan kesalahan EXC_BAD_ACCESS.
Tapi sebenarnya __autoreleasingbagus untuk apa? Saya kesulitan menemukan contoh praktis tentang kapan saya perlu menggunakan kualifikasi ini. Saya percaya itu hanya untuk fungsi dan metode yang mengharapkan pointer-pointer seperti:
- (BOOL)save:(NSError**);
atau
NSError *error = nil;
[database save:&error];
yang di bawah ARC harus dinyatakan seperti ini:
- (BOOL)save:(NSError* __autoreleasing *);
Tapi ini terlalu kabur dan saya ingin memahami alasannya . Potongan kode yang saya temukan menempatkan __autoreleasing di antara dua bintang, yang terlihat aneh bagi saya. NSError**Jenisnya adalah (pointer-pointer ke NSError), jadi mengapa menempatkan di __autoreleasingantara bintang-bintang dan tidak hanya di depan NSError**?
Juga, mungkin ada situasi lain yang harus saya andalkan __autoreleasing.