NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = array;
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);
结果是 1,1
NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array copy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);
结果是 2,2
NSArray *array = [[NSArray alloc] initWithObjects:@23, @"re", nil] ;
NSArray *arr2 = [array mutbaleCopy];
NSLog(@"%lu",(unsigned long)[array retainCount]);
NSLog(@"%lu",(unsigned long)[arr2 retainCount]);
结果是1,1
Kod di atas bukanlah salinan dalam atau salinan cetek Ia hanyalah tugasan penunjuk, dan ia menunjukkan memori yang sama.
Kod di atas secara teorinya mencipta salinan cetek
array
, tetapi sebenarnya tiada salinan berlaku, hanya saturetain
dilakukan.Ini kerana
NSArray
ialah tatasusunan baca sahaja yang tidak boleh diubah suai Apabila ia melaksanakan protokolNSCopying
, ia dengan bijak hanya melakukanretain
sekali tanpa membuat sebarang Objek baharu, jadi rujukan dikiraarray
danarr2
kedua-duanya menjadi 2, yang agak bertentangan dengan intuisi.Perhatikan bahawa pada masa ini
array
danarr2
menghala ke memori yang sama, yang boleh dilihat dengan jelas dengan mencetak alamat penuding.Dalam kod di atas,
mutableCopy
mengembalikanNSMutableArray
Pada masa ini,NSArray
tidak bernasib baik Ia hanya mencipta objekNSMutableArray
baharu danarray
menunjuk keNSArray
, <.> menunjuk kepadaarr2
yang baru dibuat, jadi kiraan rujukan ialah 1 semuanya.NSMutableArray
Kembali ke salinan dalam dan salinan cetek Untuk bekas, jika objek dalam bekas hanya meningkatkan kiraan rujukan semasa penyalinan, maka ia adalah salinan cetek, sebaliknya, jika objek baru dicipta untuk setiap objek, maka ia adalah salinan yang mendalam.
untuk mendapatkan hasil yang jelas dan betul
Sebenarnya,NSMutableArray
Bekas tidak berubah jenis ini tidak dapat melihat kesan yang diingini.NSArray
daripada
NSMutableArray
ialah salinan cetek.copy
Selain itu, titik putus, penyahpepijatan LLDB atau mencetak dan memerhati alamat memori boleh membantu kami memahami mekanisme di sini dengan lebih baik.