Edit Feb 2014: Perhatikan bahwa pertanyaan ini berasal dari iOS 2.0! Persyaratan dan penanganan gambar telah banyak berubah sejak saat itu. Retina membuat gambar lebih besar dan memuatnya sedikit lebih rumit. Dengan dukungan bawaan untuk gambar iPad dan retina, Anda pasti harus menggunakan ImageNamed dalam kode Anda .
Saya melihat banyak orang mengatakan imageNamed
itu buruk tetapi jumlah orang yang sama mengatakan kinerjanya bagus - terutama saat rendering UITableView
. Lihat pertanyaan SO ini misalnya atau artikel ini di iPhoneDeveloperTips.com
UIImage
's imageNamed
metode yang digunakan untuk bocor sehingga itu sebaiknya dihindari tetapi telah diperbaiki di rilis terbaru. Saya ingin memahami algoritme caching lebih baik untuk membuat keputusan yang masuk akal tentang di mana saya dapat mempercayai sistem untuk menyimpan gambar saya dan di mana saya harus bekerja ekstra dan melakukannya sendiri. Pemahaman dasar saya saat ini adalah bahwa hal itu sederhana NSMutableDictionary
dari UIImages
direferensikan oleh nama file. Itu menjadi lebih besar dan ketika memori habis itu menjadi jauh lebih kecil.
Misalnya, apakah ada yang tahu pasti bahwa cache gambar di belakang imageNamed
tidak merespons didReceiveMemoryWarning
? Sepertinya Apple tidak akan melakukan ini.
Jika Anda memiliki wawasan tentang algoritma caching, silakan posting di sini.
Jawaban:
tldr: ImagedNamed baik-baik saja. Ini menangani memori dengan baik. Gunakan dan berhentilah khawatir.
Sunting November 2012 : Perhatikan bahwa pertanyaan ini berasal dari iOS 2.0! Persyaratan dan penanganan gambar telah banyak berubah sejak saat itu. Retina membuat gambar lebih besar dan memuatnya sedikit lebih rumit. Dengan dukungan bawaan untuk gambar iPad dan retina, Anda pasti harus menggunakan ImageNamed dalam kode Anda. Sekarang, demi anak cucu:
Rangkaian sister di Apple Dev Forums menerima lalu lintas yang lebih baik. Secara khusus Rincewind menambahkan beberapa otoritas.
sambil memperingatkan itu
dan
Jadi, begitulah. imageNamed: tidak akan menghancurkan jendela Anda atau membunuh anak-anak Anda. Ini cukup sederhana tetapi ini adalah alat pengoptimalan. Sayangnya nama itu salah dan tidak ada persamaan yang mudah digunakan - oleh karena itu orang-orang menggunakannya secara berlebihan dan menjadi kesal ketika itu hanya melakukan tugasnya
Saya menambahkan kategori ke UIImage untuk memperbaikinya:
Rincewind juga menyertakan beberapa kode contoh untuk membuat versi Anda sendiri yang dioptimalkan. Saya tidak bisa melihat itu sepadan dengan pemeliharaannya tetapi ini dia untuk kelengkapan.
Kekurangan dari kode ini adalah bahwa gambar yang didekodekan menggunakan lebih banyak memori tetapi rendering lebih cepat.
sumber
Menurut pengalaman saya, cache gambar yang dibuat oleh imageNamed tidak merespons peringatan memori. Saya memiliki dua aplikasi yang seramping yang saya bisa dapatkan sejauh manajemen mem, tetapi masih macet secara misterius karena kurangnya mem. Saat saya berhenti menggunakan imageNamed untuk memuat gambar, kedua aplikasi menjadi lebih stabil secara dramatis.
Saya akan mengakui bahwa kedua aplikasi memuat gambar yang agak besar, tetapi tidak ada yang benar-benar luar biasa. Pada aplikasi pertama, saya melewatkan caching sama sekali karena kecil kemungkinannya pengguna akan kembali ke gambar yang sama dua kali. Yang kedua, saya membangun kelas caching yang sangat sederhana dengan melakukan apa yang Anda sebutkan - menjaga UIImages dalam NSMutableDictionary dan kemudian membersihkan isinya jika saya menerima peringatan memori. Jika imageNamed: di-cache seperti itu, maka saya seharusnya tidak melihat peningkatan kinerja apa pun. Semua ini berjalan di 2.2 - Saya tidak tahu apakah ada implikasi 3.0 tentang ini.
Anda dapat menemukan pertanyaan saya yang lain seputar masalah ini dari aplikasi pertama saya di sini: Pertanyaan StackOverflow tentang cache gambar UII
Satu catatan lain - InterfaceBuilder menggunakan imageNamed di bawah sampulnya. Sesuatu yang perlu diingat jika Anda mengalami masalah ini.
sumber