Rumah > Soal Jawab > teks badan
疑惑:
1、内存管理:dealloc之后还能打印出retainCount = 1
main方法中:
person方法中覆写的dealloc方法和打印结果
2、 两个 category都只覆写了dealloc方法,用来输出验证
Copy创建的对象release之后调用dealloc方法,但是在自动释放池释放对象时,又释放了一次
为什么会释放两次啊?
3、使用类名方法创建对象,引用计数为2
阿神2017-04-24 09:14:06
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
.
NSArray *a = [[NSArray alloc] init];
[NSArray array];
[NSArray array];
NSLog("retainCount = %ld", a.retainCount);//输出结果为4
Jika ARC tidak dihidupkan, pengurusan memori hanya perlu mengikut empat "peraturan emas" dalam peraturan asas pengurusan memori dalam dokumen Apple.
PHP中文网2017-04-24 09:14:06
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.