Mari kita mulai dengan retain
dan release
; autorelease
benar-benar hanya kasus khusus setelah Anda memahami konsep dasarnya.
Di Cocoa, setiap objek melacak berapa kali itu direferensikan (khususnya, NSObject
kelas dasar mengimplementasikan ini). Dengan memanggil retain
suatu objek, Anda mengatakan kepadanya bahwa Anda ingin menambah jumlah referensinya satu per satu. Dengan memanggil release
, Anda memberi tahu objek yang Anda lepaskan, dan jumlah referensinya berkurang. Jika, setelah memanggil release
, jumlah referensi sekarang nol, maka memori objek tersebut dibebaskan oleh sistem.
Cara dasar ini berbeda dari malloc
danfree
adalah bahwa objek tertentu tidak perlu khawatir tentang bagian lain dari sistem yang mogok karena Anda telah membebaskan memori yang mereka gunakan. Dengan asumsi semua orang bermain bersama dan mempertahankan / melepaskan sesuai dengan aturan, ketika satu bagian kode mempertahankan dan kemudian melepaskan objek, bagian kode lain yang juga mereferensikan objek tidak akan terpengaruh.
Apa yang terkadang membingungkan adalah mengetahui keadaan di mana Anda harus menelepon retain
dan release
. Aturan umum saya adalah bahwa jika saya ingin berpegang pada suatu objek untuk beberapa lama waktu (jika itu adalah variabel anggota di kelas, misalnya), maka saya perlu memastikan jumlah referensi objek tahu tentang saya. Seperti dijelaskan di atas, jumlah referensi objek bertambah dengan pemanggilan retain
. Menurut konvensi, itu juga bertambah (disetel ke 1, sebenarnya) saat objek dibuat dengan metode "init". Dalam salah satu kasus ini, adalah tanggung jawab saya untuk memanggil release
objek tersebut setelah saya selesai. Jika tidak, akan ada kebocoran memori.
Contoh pembuatan objek:
NSString* s = [[NSString alloc] init]; // Ref count is 1
[s retain]; // Ref count is 2 - silly
// to do this after init
[s release]; // Ref count is back to 1
[s release]; // Ref count is 0, object is freed
Sekarang untuk autorelease
. Pelepasan otomatis digunakan sebagai cara yang nyaman (dan terkadang perlu) untuk memberi tahu sistem agar membebaskan objek ini setelah beberapa saat. Dari perspektif perpipaan, saat autorelease
dipanggil, utas saat NSAutoreleasePool
ini diberitahu tentang panggilan tersebut. The NSAutoreleasePool
sekarang tahu bahwa setelah mendapat kesempatan (setelah iterasi saat loop acara), dapat memanggil release
pada objek. Dari sudut pandang kami sebagai programmer, itu mengurus panggilan release
untuk kami, jadi kami tidak perlu (dan sebenarnya, kami tidak seharusnya).
Yang penting untuk diperhatikan adalah bahwa (sekali lagi, menurut konvensi) semua metode kelas pembuatan objek mengembalikan objek yang dirilis secara otomatis. Misalnya, dalam contoh berikut, variabel "s" memiliki jumlah referensi 1, tetapi setelah event loop selesai, variabel itu akan dimusnahkan.
NSString* s = [NSString stringWithString:@"Hello World"];
Jika Anda ingin bergantung pada string itu, Anda harus memanggilnya retain
secara eksplisit, dan kemudian secara eksplisit release
setelah selesai.
Pertimbangkan sedikit kode berikut (sangat dibuat-buat), dan Anda akan melihat situasi di mana autorelease
diperlukan:
- (NSString*)createHelloWorldString
{
NSString* s = [[NSString alloc] initWithString:@"Hello World"];
// Now what? We want to return s, but we've upped its reference count.
// The caller shouldn't be responsible for releasing it, since we're the
// ones that created it. If we call release, however, the reference
// count will hit zero and bad memory will be returned to the caller.
// The answer is to call autorelease before returning the string. By
// explicitly calling autorelease, we pass the responsibility for
// releasing the string on to the thread's NSAutoreleasePool, which will
// happen at some later time. The consequence is that the returned string
// will still be valid for the caller of this function.
return [s autorelease];
}
Saya menyadari semua ini agak membingungkan - pada titik tertentu, itu akan berbunyi klik. Berikut adalah beberapa referensi untuk membantu Anda:
- Pengenalan Apple untuk manajemen memori.
- Cocoa Programming for Mac OS X (4th Edition) , oleh Aaron Hillegas - sebuah buku yang ditulis dengan sangat baik dengan banyak contoh yang bagus. Bunyinya seperti tutorial.
- Jika Anda benar-benar menyelam, Anda bisa menuju ke Peternakan Big Nerd . Ini adalah fasilitas pelatihan yang dijalankan oleh Aaron Hillegas - penulis buku yang disebutkan di atas. Saya menghadiri kursus Pengenalan Kakao di sana beberapa tahun yang lalu, dan itu adalah cara yang bagus untuk belajar.