三个关于objective-c内存管理的疑惑,希望能有人帮我解答
PHPz
PHPz 2017-04-24 09:12:06
0
2
338

疑惑:
1、内存管理:dealloc之后还能打印出retainCount = 1
main方法中:

person方法中覆写的dealloc方法和打印结果

2、 两个 category都只覆写了dealloc方法,用来输出验证
Copy创建的对象release之后调用dealloc方法,但是在自动释放池释放对象时,又释放了一次
为什么会释放两次啊?

3、使用类名方法创建对象,引用计数为2

PHPz
PHPz

学习是最好的投资!

membalas semua(2)
阿神
  1. Jawapan untuk Biji Tembikai Luar Biasa adalah betul.

  2. 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.

  3. 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.

Ty80

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!