Jawapan untuk Biji Tembikai Luar Biasa adalah betul.
Memanggil NSMutableArray pada objek copy mengembalikan objek NSArray, jadi apabila [array4 release] dipanggil, kaedah dealloc array4 dipanggil dan NSArray dealloc adalah output.
Kemudian autoreleasepool dimusnahkan, array3 dikeluarkan, dan kaedah dealloc array3 dipanggil Kerana [super dealloc] dipanggil dalam kaedah dealloc NSMutableArray, dua ayat berikut adalah output.
Menurut jawapan pada StackOverflow, ini adalah kerana NSArray ialah objek tidak berubah, dan apa yang dijana oleh [NSArray array] atau [[NSArray alloc] init] ialah tatasusunan kosong yang tidak berubah, jadi Apple lalai kepada semua titik Rujukan kosong yang tidak berubah kepada contoh unik untuk pengoptimuman, jadi sebelum [NSArray array], bilangan pengekalan bagi tika ini ialah 1. Sama ada [NSArray array] atau [[NSArray alloc] init] dalam kod akan meningkatkan kiraan rujukan bagi contoh tatasusunan kosong ini.
Kod berikut boleh mencerminkan perkara ini dengan lebih intuitif Pernyataan a yang tiada kaitan dengan [NSArray array] meningkatkan kiraan rujukan a.
Jawab soalan pertama
Memori objek telah dituntut semula semasa output.
Apabila menghantar mesej retainCount ke objek yang telah dikitar semula, hasil output seharusnya tidak pasti Jika memori yang diduduki oleh objek itu digunakan semula, ia boleh menyebabkan program ranap secara tidak normal.
Mengapakah nilai tak tentu ini 1 dan bukannya 0? Kerana apabila release dilaksanakan buat kali terakhir, sistem tahu bahawa memori akan dikitar semula, jadi tidak perlu mengurangkan retainCount sebanyak 1, kerana objek itu pasti akan dikitar semula tanpa mengira sama ada ia berkurangan dengan 1 atau tidak.
Tidak mengubah nilai ini daripada 1 kepada 0 boleh mengurangkan satu operasi memori dan mempercepatkan kitar semula objek.
Kesimpulan: Jangan hantar mesej kepada objek yang telah dikeluarkan.
Jawapan untuk Biji Tembikai Luar Biasa adalah betul.
Memanggil
NSMutableArray
pada objekcopy
mengembalikan objek NSArray, jadi apabila[array4 release]
dipanggil, kaedah dealloc array4 dipanggil danNSArray dealloc
adalah output.Kemudian autoreleasepool dimusnahkan, array3 dikeluarkan, dan kaedah dealloc array3 dipanggil Kerana
[super dealloc]
dipanggil dalam kaedah dealloc NSMutableArray, dua ayat berikut adalah output.Menurut jawapan pada StackOverflow, ini adalah kerana NSArray ialah objek tidak berubah, dan apa yang dijana oleh
[NSArray array]
atau[[NSArray alloc] init]
ialah tatasusunan kosong yang tidak berubah, jadi Apple lalai kepada semua titik Rujukan kosong yang tidak berubah kepada contoh unik untuk pengoptimuman, jadi sebelum[NSArray array]
, bilangan pengekalan bagi tika ini ialah 1. Sama ada[NSArray array]
atau[[NSArray alloc] init]
dalam kod akan meningkatkan kiraan rujukan bagi contoh tatasusunan kosong ini.Kod berikut boleh mencerminkan perkara ini dengan lebih intuitif Pernyataan
a
yang tiada kaitan dengan[NSArray array]
meningkatkan kiraan rujukana
.Jika ARC tidak dihidupkan, pengurusan memori hanya perlu mengikut empat "peraturan emas" dalam peraturan asas pengurusan memori dalam dokumen Apple.
Jawab soalan pertama
Memori objek telah dituntut semula semasa output.
Apabila menghantar mesej
retainCount
ke objek yang telah dikitar semula, hasil output seharusnya tidak pasti Jika memori yang diduduki oleh objek itu digunakan semula, ia boleh menyebabkan program ranap secara tidak normal.Mengapakah nilai tak tentu ini 1 dan bukannya 0? Kerana apabila
release
dilaksanakan buat kali terakhir, sistem tahu bahawa memori akan dikitar semula, jadi tidak perlu mengurangkanretainCount
sebanyak 1, kerana objek itu pasti akan dikitar semula tanpa mengira sama ada ia berkurangan dengan 1 atau tidak.Tidak mengubah nilai ini daripada 1 kepada 0 boleh mengurangkan satu operasi memori dan mempercepatkan kitar semula objek.
Kesimpulan: Jangan hantar mesej kepada objek yang telah dikeluarkan.