Saya mencoba mempelajari Penghitungan Referensi Otomatis di iOS 5. Sekarang bagian pertama dari pertanyaan ini seharusnya mudah:
Apakah benar bahwa saya TIDAK perlu menulis pernyataan properti rilis eksplisit di dealloc saya saat menggunakan ARC? Dengan kata lain, apakah benar bahwa berikut TIDAK memerlukan dealloc eksplisit?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
Pertanyaan saya berikutnya dan yang lebih penting datang dari sebuah baris di dokumen Transitioning to ARC Release Notes :
Anda tidak harus (memang tidak bisa) melepaskan variabel instan, tetapi Anda mungkin perlu memanggil [self setDelegate: nil] pada kelas sistem dan kode lain yang tidak dikompilasi menggunakan ARC.
Ini menimbulkan pertanyaan: bagaimana saya tahu kelas sistem mana yang tidak dikompilasi dengan ARC? Kapan saya harus membuat dealloc saya sendiri dan secara eksplisit menetapkan properti yang sangat mempertahankan ke nol? Haruskah saya menganggap semua kelas kerangka kerja NS dan UI yang digunakan dalam properti memerlukan deallocs eksplisit?
Ada banyak informasi tentang SO dan di tempat lain tentang praktik melepaskan ivar dukungan properti ketika menggunakan pelacakan referensi manual, tetapi relatif sedikit tentang hal ini ketika menggunakan ARC.
sumber
MyController : UIViewController
kelas yang membuat dan memiliki UIView dan juga menetapkan delegasi tampilan untuk dirinya sendiri. Ini adalah pemilik penahan tunggal dari pandangan itu. Ketika pengontrol mendapatkan dealloc'ed, maka view juga harus mendapatkan dealloc'ed. Apakah itu penting jika pointer delegasi menggantung?UIWebView
, dokumen secara eksplisit menyatakan bahwa Anda perlu meniadakan delegasi.unsafe_unretained
Persis sama denganassign
properti dan merupakan perilaku normal untuk mendelegasikan hubungan di bawah MRR, dan ini harus dituntaskan.Hanya untuk memberikan jawaban yang berlawanan ...
Jawaban singkat : tidak, Anda tidak perlu menghilangkan properti yang disintesis secara otomatis di
dealloc
bawah ARC. Dan Anda tidak harus menggunakan setter untuk mereka yang masukinit
.Jawaban panjang : Anda harus menemukan properti yang disintesis khusus di
dealloc
, bahkan di bawah ARC. Dan Anda harus menggunakan setter bagi mereka diinit
.Intinya properti Anda yang disintesis khusus harus aman dan simetris tentang pembatalan.
Penyetel kemungkinan untuk penghitung waktu:
Penyetel yang mungkin untuk scrollview, tableview, webview, textfield, ...:
Penyetel yang mungkin untuk properti KVO:
Maka Anda tidak perlu menduplikasi kode apapun untuk
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... dan properti Anda aman dapat dibuat publik. Jika Anda khawatir tentang nil out properti didealloc
, maka mungkin sudah saatnya Anda memeriksa lagi setter Anda.sumber