Bagaimana Anda menghapus pengamat dari objek di bawah ARC ? Apakah kita hanya menambahkan pengamat dan lupa menghapusnya? Jika kita tidak lagi mengelola memori secara manual di mana kita berhenti mengamati?
Misalnya, pada pengontrol tampilan:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Sebelumnya, saya akan memanggil metode removeObserver:
pengontrol tampilan dealloc
.
@"frame"
bukan@"self.frame"
?Jawaban:
Anda masih dapat menerapkan di
-dealloc
bawah ARC, yang tampaknya merupakan tempat yang tepat untuk menghapus pengamatan nilai kunci. Anda hanya tidak menelepon[super dealloc]
dari dalam metode ini lagi.Jika Anda menimpa
-release
sebelumnya, Anda melakukan sesuatu dengan cara yang salah.sumber
[super dealloc]
. Siapa lagi yang harus melakukan ini untuk Anda.[super dealloc]
dengan metode dealloc. Tidak tahu bagaimana ini akan bekerja saat membuat subclass kelas yang disebutkan. Mungkin hanya disarankan untuk menggunakanfinalize
sebagai gantinya (jika Anda menelepon[super finalize]
)[super dealloc]
terakhir dalam metode itu selalu merupakan bug di bawah manajemen memori manual, kompilator menanganinya untuk Anda sekarang, itulah sebabnya Anda tidak dapat memanggil-dealloc
secara langsung lagi. Satu-satunya hal yang Anda masukkan ke dalam-dealloc
metode di bawah ARC adalah sumber daya non-objek apa pun yang perlu Anda bebaskan, atau tugas pembersihan seperti menghapus pengamat. Kata-kata yang mereka gunakan agak berlumpur, tapi inilah yang mereka maksud.-finalize
digunakan untuk ini di bawah pengumpulan sampah, di mana-dealloc
tidak pernah dipanggil, tetapi sangat dapat diterima untuk menempatkan kode ini di-dealloc
bawah ARC.[super dealloc]
dipanggil untuk Anda secara otomatis, itulah sebabnya mengapa salah memanggilnya di bawah ARC.Saya melakukannya dengan kode ini
- (void)dealloc { @try{ [self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil]; } @catch(id anException) { //do nothing, obviously it wasn't attached because an exception was thrown } }
sumber
dealloc
? Sudah terlambat untuk melakukan sesuatu tentang itu.Di tempat lain di stack overflow, Chris Hanson menyarankan penggunaan metode finalisasi untuk tujuan ini dan menerapkan metode pembatalan terpisah sehingga pemilik dapat memberi tahu objek bahwa mereka sudah selesai. Di masa lalu saya telah menemukan solusi Hanson untuk dipikirkan dengan baik, jadi saya akan pergi dengan itu.
sumber
-dealloc
tidak pernah dipanggil. Di ARC, itu benar. Sangat dapat diterima untuk menghapus pengamat KVO-dealloc
, seperti yang ditunjukkan oleh Chris Lattner (yang tahu apa yang dia bicarakan) di forum pengembang Apple di sini: devforums.apple.com/message/475850