Technologieaustausch

copy und mutableCopy sind etwas verwirrend

2024-07-12

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

Führt eine Kopie eines String-Literals durch

Um die Adresse des Objekts, auf das der Zeiger zeigt, und die Adresse des Zeigers selbst auszudrucken, können Sie verwenden %p Formatzeichen zur Ausgabe der Zeigeradresse.Der folgende Code zeigtoriginalString UndcopiedString Die Zeigeradresse und die Adresse, die auf das Objekt zeigt:

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

Die laufenden Ergebnisse von Xcode Version 15.1 (15C65) und Simulator (iPhone 15) sind wie folgt:

// 打印的内容一样
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

erklären

  • Original: Hello, World! UndCopied: Hello, World! Geben Sie den String-Inhalt aus.
  • Original pointer address: %p AusgabezeigeroriginalString Die Adresse selbst auf dem Stapel.
  • Copied pointer address: %p AusgabezeigercopiedString Die Adresse selbst auf dem Stapel.
  • Original object address: %p AusgabeoriginalString Die Adresse im Heap des String-Objekts, auf das verwiesen wird.
  • Copied object address: %p AusgabecopiedString Die Adresse im Heap des String-Objekts, auf das verwiesen wird.

Es ist ersichtlich, dass aufgrund NSString ist ein unveränderliches Objekt und wird ausgeführtcopy Die Methode erstellt kein neues Objekt, sondern gibt dasselbe Objekt zurück.AlsooriginalString UndcopiedString Zeigen Sie auf dieselbe Speicheradresse (die Objektadresse ist dieselbe), aber ihre Zeiger selbst haben unterschiedliche Adressen auf dem Stapel.


Führen Sie mutableCopy für ein Zeichenfolgenliteral aus

    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

Die laufenden Ergebnisse von Xcode Version 15.1 (15C65) und Simulator (iPhone 15) sind wie folgt:

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