我不是很明白其中“nsmutablearray类对象被赋值给变量obj,但obj自己并不持有该对象,使用retain可以持有该对象”这句话。
然后我在网上看到这个,应该是对应“非自己生成的对象,自己也能持有”这个情况,然后我写了下面的代码
NSMutableArray *array = [NSMutableArray arrayWithObjects: @"one", @"two", nil];
NSString *elem = array[0];
[array removeAllObjects];
NSLog(@"%@", elem);
既然removeallobjects了就应该被dealloc了,为什么还能打印出elem呢?
还有第二种代码,person被release之后为什么还可以访问name
People *person = [[People alloc] init];
[person release];
NSString *name = person.name;
NSLog(@"%@", name);
Ini ialah masalah dengan mekanisme pengiraan rujukan Ringkasnya, apabila objek dimulakan melalui peruntukan, salinan, dll., RetainCountnya akan menjadi 1. Setiap kali ia dikekalkan, retainCount meningkat sebanyak 1 dan setiap kali ia. dilepaskan, retainCount Tolak 1. Apabila objek ditambahkan pada koleksi (seperti tatasusunan), ia akan dikekalkan secara automatik sekali, dan apabila ia dialih keluar daripada koleksi, ia akan dikeluarkan secara automatik. Apabila retainCount objek menjadi 0, objek akan ditandakan sebagai percuma Pada dasarnya, objek itu tidak boleh diakses lagi pada masa ini, kerana ia boleh dikeluarkan pada bila-bila masa.
"Objek yang tidak dihasilkan oleh anda sendiri juga boleh dipegang oleh anda sendiri" bermakna walaupun objek tidak dihasilkan oleh anda sendiri, anda boleh mengekalkannya, jadi RetainCountnya meningkat sebanyak 1. Jika tiada pelepasan berlebihan di tempat lain, dalam Sebelum anda melepaskannya, retainCountnya ialah sekurang-kurangnya 1, yang sama seperti anda memegangnya.
Dua masalah terakhir anda ialah kod ujian anda menggunakan objek NSString tidak mengikut kaedah kekalkan/lepaskan Anda boleh menggantikan semua NSString dalam ujian anda dengan NSMutableString atau mana-mana objek cuba.
Soalan terakhir ialah retainCount hendaklah 0 selepas orang dikeluarkan. Mengapa saya masih boleh mengakses person.name? Sebabnya ialah objek yang ditunjuk oleh penuding orang tidak akan dikosongkan serta-merta selepas retainCountnya mencapai 0. Ia mungkin perlu menunggu sehingga runloop seterusnya Pada masa ini, penunjuk orang masih menunjuk ke objek itu, dan namanya ialah NSString, jadi ia boleh diakses.