Di aplikasi iPad kecil saya, saya memiliki fungsi "ganti bahasa" yang menggunakan pengamat. Setiap view controller mendaftar sendiri dengan pengamat saya selama itu viewDidLoad:
.
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Ketika pengguna menekan tombol "ganti bahasa", bahasa baru disimpan dalam model saya dan pengamat diberitahu dan memanggil updateUi:
pemilih pada objek yang terdaftar.
Ini bekerja dengan sangat baik, kecuali ketika saya memiliki pengontrol tampilan di TabBarController. Ini karena ketika bilah tab dimuat, ikon ikon mengambil tab dari pengontrol anak tanpa menginisialisasi tampilan, jadi viewDidLoad:
tidak dipanggil, sehingga pengontrol tampilan tersebut tidak menerima pemberitahuan perubahan bahasa. Karena itu, saya memindahkan registerObject:
panggilan saya ke init
metode.
Dulu ketika saya viewDidLoad:
mendaftar dengan pengamat saya, saya biasanya viewDidUnload:
tidak mendaftar . Karena saya sekarang mendaftar init
, masuk akal untuk membatalkan pendaftaran dealloc
.
Tapi ini masalah saya. Ketika saya menulis:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
Saya mendapatkan kesalahan ini:
ARC melarang pengiriman pesan eksplisit 'dealloc'
Karena saya perlu menelepon [super dealloc]
untuk memastikan superclasses membersihkan dengan benar, tetapi ARC melarang itu, saya sekarang terjebak. Apakah ada cara lain untuk mendapat informasi ketika objek saya sekarat?
Jawaban:
Saat menggunakan ARC, Anda tidak perlu menelepon
[super dealloc]
secara eksplisit - kompilator menanganinya untuk Anda (seperti yang dijelaskan dalam dokumen Dentang LLVM ARC, bab 7.1.2 ):sumber
dealloc
tidak pernah dipanggil. Apakah masuk akal untuk memanggil[observer unregisterObject:self]
dealloc? Apa yang saya lewatkan?