Berbagi teknologi

copy dan mutableCopy agak membingungkan

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Lakukan salinan string literal

Untuk mencetak alamat objek yang ditunjuk oleh pointer dan alamat pointer itu sendiri, Anda dapat menggunakan %p memformat karakter untuk menampilkan alamat penunjuk.Kode berikut menunjukkanoriginalString DancopiedString Alamat penunjuk dan alamat yang menunjuk ke objek:

NSString *originalString = @"Hello, World!";
NSString *copiedString = [originalString copy];

// 打印字符串内容
NSLog(@"Original: %@", originalString); // 输出: Hello, World!
NSLog(@"Copied: %@", copiedString);     // 输出: Hello, World!

// 打印指针本身的地址
NSLog(@"Original pointer address: %p", &originalString);
NSLog(@"Copied pointer address: %p", &copiedString);

// 打印指针指向对象的地址
NSLog(@"Original object address: %p", originalString);
NSLog(@"Copied object address: %p", copiedString);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

Hasil menjalankan Xcode Versi 15.1 (15C65) & Simulator (iPhone 15) adalah sebagai berikut:

// 打印的内容一样
Original: Hello, World!
Copied: Hello, World!
// 指针本地的地址不一样,说明是不同的指针
Original pointer address: 0x7ff7b1a5fa98
Copied pointer address: 0x7ff7b1a5fa90
// 不同的指针指向同一个对象
Original object address: 0x10e4a0070
Copied object address: 0x10e4a0070
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

menjelaskan

  • Original: Hello, World! DanCopied: Hello, World! Keluarkan konten string.
  • Original pointer address: %p Penunjuk keluaranoriginalString Alamat itu sendiri di tumpukan.
  • Copied pointer address: %p Penunjuk keluarancopiedString Alamat itu sendiri di tumpukan.
  • Original object address: %p keluaranoriginalString Alamat di tumpukan objek string yang ditunjuk.
  • Copied object address: %p keluarancopiedString Alamat di tumpukan objek string yang ditunjuk.

Hal ini terlihat karena NSString adalah objek yang tidak dapat diubah dan dieksekusicopy Metode tidak membuat objek baru, namun mengembalikan objek yang sama.JadioriginalString DancopiedString Arahkan ke alamat memori yang sama (alamat objeknya sama), tetapi penunjuknya sendiri memiliki alamat berbeda di tumpukan.


Lakukan mutableCopy pada string literal

    NSString *originalString = @"Hello, World!";
    NSString *copiedString = [originalString mutableCopy];

    // 打印字符串内容
    
    NSLog(@"Original: %@", originalString); // 输出: Hello, World!
    NSLog(@"Copied: %@", copiedString);     // 输出: Hello, World!

    // 打印指针本身的地址
    NSLog(@"Original pointer address: %p", &originalString);
    NSLog(@"Copied pointer address: %p", &copiedString);

    // 打印指针指向对象的地址
    NSLog(@"Original object address: %p", originalString);
    NSLog(@"Copied object address: %p", copiedString);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

Hasil menjalankan Xcode Versi 15.1 (15C65) & Simulator (iPhone 15) adalah sebagai berikut:

Original: Hello, World!
Copied: Hello, World!
// 不同的指针
Original pointer address: 0x7ff7be102a98
Copied pointer address: 0x7ff7be102a90
// 指向不同的对象
Original object address: 0x101dfd070
Copied object address: 0x600000c80090
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8