Apa -(void)viewDidUnload
gunanya?
Tidak bisakah saya melepaskan semuanya -dealloc
? Jika tampilan tidak dimuat, tidak -dealloc
akan dipanggil?
Apa -(void)viewDidUnload
gunanya?
Tidak bisakah saya melepaskan semuanya -dealloc
? Jika tampilan tidak dimuat, tidak -dealloc
akan dipanggil?
Jawaban:
Selain apa yang telah ditunjukkan, saya ingin menjelaskan lebih lanjut tentang logika di baliknya -viewDidUnload
.
Salah satu alasan terpenting untuk mengimplementasikannya adalah bahwa UIViewController
subclass biasanya juga berisi referensi yang memiliki berbagai subview dalam hierarki tampilan. Properti ini dapat diatur melalui IBOutlets
saat memuat dari nib, atau secara terprogram di dalam -loadView
, misalnya.
Kepemilikan tambahan subview dengan UIViewController
cara bahwa meskipun pandangannya dihapus dari hierarki tampilan dan dilepaskan untuk menghemat memori, yang melaluinya subview juga dilepaskan oleh tampilan, mereka tidak akan benar-benar dibatalkan alokasinya karena UIViewController
itu sendiri masih berisi outstanding miliknya sendiri. mempertahankan referensi ke objek tersebut juga. Melepaskan UIViewController
kepemilikan tambahan dari objek-objek ini memastikan mereka akan dibatalkan alokasinya juga untuk mengosongkan memori.
Objek yang Anda lepaskan di sini biasanya dibuat ulang dan disetel lagi saat UIViewController
tampilannya re-loaded
, baik dari Nib atau melalui implementasi -loadView
.
Juga perhatikan bahwa UIViewController
view
properti tersebut nil
pada saat metode ini dipanggil.
Seperti yang dikatakan dalam dokumentasi :
Ini dipanggil selama kondisi memori rendah ketika pengontrol tampilan perlu melepaskan tampilannya dan objek apa pun yang terkait dengan tampilan tersebut untuk mengosongkan memori.
Dalam situasi yang sama dealloc
yang tidak disebut. Metode ini hanya tersedia di OS3 ke atas. Berurusan dengan situasi yang sama di iPhone OS 2.x benar-benar menyakitkan!
Pembaruan Juli 2015 : Perlu dicatat bahwa viewDidUnload
itu tidak digunakan lagi di iOS 6 karena "Tampilan tidak lagi dihapus dalam kondisi memori rendah sehingga metode ini tidak pernah dipanggil." Jadi, saran modern jangan khawatir tentang itu dan gunakan dealloc
.
Ini karena Anda biasanya akan menyetel @property
sebagai "(nonatomic, retain)"
dan sebagai penyetel yang dibuat untuk Anda melepaskan objek saat ini dan kemudian mempertahankan argumen yaitu
self.property = nil;
... melakukan sesuatu di sepanjang baris:
[property release];
property = [nil retain];
Oleh karena itu Anda membunuh dua burung dengan satu batu: manajemen memori (melepaskan objek yang ada) dan menetapkan penunjuk ke nil (karena mengirim pesan apa pun ke penunjuk nil akan mengembalikan nihil).
Semoga membantu.
Ingat itu viewDidUnload
adalah metode dalam pengontrol tampilan, bukan dalam tampilan. Metode tampilan dealloc
akan dipanggil saat tampilan dibongkar, tetapi metode pengontrol tampilan dealloc
mungkin tidak dipanggil hingga nanti.
Jika Anda mendapatkan peringatan memori rendah dan tampilan Anda tidak muncul, yang akan terjadi misalnya kapan saja Anda menggunakan UIImagePickerController untuk mengizinkan pengguna mengambil gambar, tampilan Anda akan dibongkar dan harus dimuat ulang setelah itu.
Kesimpulan:
View Controllers memiliki properti view. Biasanya ujung atau potongan kode menambahkan tampilan lain ke tampilan ini. Ini sering terjadi di dalam metode -viewDidLoad, seperti ini:
- (void)viewDidLoad {
[super viewDidLoad];
[self createManyViewsAndAddThemToSelfDotView];
}
selain itu, file ujung pena dapat membuat tombol dan menambahkannya ke tampilan pengontrol tampilan.
Pada iPhone OS 2.2, ketika -didReceiveMemoryWarning dipanggil dari sistem, Anda harus melepaskan sesuatu untuk mengosongkan memori. Anda bisa melepaskan tampilan seluruh pengontrol tampilan jika itu masuk akal. Atau hanya konten yang menghabiskan banyak memori di dalamnya.
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning]; // Releases the view if it doesn't have a superview
// Release anything that's not essential, such as cached data
}
Sekarang, di OS 3.0 yang baru, ada metode -viewDidUnload, yang akan dipanggil dari sistem ketika view telah dibongkar karena memori yang rendah (tolong koreksi saya: kapan tepatnya ini dipanggil?)
-viewDidUnload digunakan untuk melepaskan semua objek yang dimiliki oleh pengontrol tampilan itu sendiri dan tampilan. Alasan: Jika pengontrol tampilan menyimpan referensi ke turunan tampilan, yaitu tombol, tampilan turunan yang direferensikan tidak akan dirilis, karena jumlah penahannya adalah> = 1. Setelah dirilis di -viewDidUnload, mereka bisa dibebaskan dari ingatan.
Apple menghentikan viewWillUnload, sekarang Anda harus menggunakan didReceiveMemoryWarning atau dealloc untuk merilis objek Anda.
Di iOS 6, metode viewWillUnload dan viewDidUnload UIViewController sekarang tidak digunakan lagi. Jika Anda menggunakan metode ini untuk merilis data, gunakan metode didReceiveMemoryWarning. Anda juga dapat menggunakan metode ini untuk merilis referensi ke tampilan pengontrol tampilan jika tidak sedang digunakan. Anda perlu menguji bahwa tampilan tidak ada di jendela sebelum melakukan ini.
Jika pengontrol tampilan dimunculkan dari tumpukan pengontrol navigasi dan tidak dipertahankan di tempat lain, alokasinya akan dibatalkan, dan dealloc akan dipanggil sebagai ganti viewDidUnload. Anda harus merilis tampilan yang dibuat di loadView dalam dealloc, tetapi tidak perlu menyetel variabel ke nil, karena segera setelah dealloc dipanggil, variabel tidak akan ada lagi.
Anda bisa merilis subview yang Anda pegang, misalnya UIImageView yang Anda pertahankan dalam metode loadView, atau lebih baik lagi gambar yang ada di UIImageView tersebut.