objective-c - NSArray *array = otherarray;是深拷贝还是浅拷贝?该怎么理解
PHPz
PHPz 2017-04-24 09:11:20
0
2
485

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

所以应该怎么理解???

PHPz
PHPz

学习是最好的投资!

membalas semua(2)
PHPzhong
NSArray *arr2 = array;

Kod di atas bukanlah salinan dalam atau salinan cetek Ia hanyalah tugasan penunjuk, dan ia menunjukkan memori yang sama.


NSArray *arr2 = [array copy];

Kod di atas secara teorinya mencipta salinan cetek array, tetapi sebenarnya tiada salinan berlaku, hanya satu retain dilakukan.

Ini kerana NSArray ialah tatasusunan baca sahaja yang tidak boleh diubah suai Apabila ia melaksanakan protokol NSCopying, ia dengan bijak hanya melakukan retain sekali tanpa membuat sebarang Objek baharu, jadi rujukan dikira array dan arr2 kedua-duanya menjadi 2, yang agak bertentangan dengan intuisi.

Perhatikan bahawa pada masa ini array dan arr2 menghala ke memori yang sama, yang boleh dilihat dengan jelas dengan mencetak alamat penuding.


NSArray *arr2 = [array mutableCopy];

Dalam kod di atas, mutableCopy mengembalikan NSMutableArray Pada masa ini, NSArray tidak bernasib baik Ia hanya mencipta objek NSMutableArray baharu dan array menunjuk ke NSArray , <.> menunjuk kepada arr2 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.

Penyoal harus cuba menggunakan

untuk mendapatkan hasil yang jelas dan betul NSMutableArray Bekas tidak berubah jenis ini tidak dapat melihat kesan yang diingini. NSArray

Sebenarnya,

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan