Apa -(void)viewDidUnload
gunanya?
Tidak bisakah saya melepaskan semuanya -dealloc
? Jika tampilan tidak dimuat, tidak -dealloc
akan dipanggil?
sumber
Apa -(void)viewDidUnload
gunanya?
Tidak bisakah saya melepaskan semuanya -dealloc
? Jika tampilan tidak dimuat, tidak -dealloc
akan dipanggil?
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 :
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 gunakandealloc
.sumber
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... melakukan sesuatu di sepanjang baris:
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.
sumber
Ingat itu
viewDidUnload
adalah metode dalam pengontrol tampilan, bukan dalam tampilan. Metode tampilandealloc
akan dipanggil saat tampilan dibongkar, tetapi metode pengontrol tampilandealloc
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.
sumber
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:
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.
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.
sumber
Apple menghentikan viewWillUnload, sekarang Anda harus menggunakan didReceiveMemoryWarning atau dealloc untuk merilis objek Anda.
sumber
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.
sumber
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.
sumber