Partage de technologie

copy et mutableCopy sont un peu déroutants

2024-07-12

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

Effectuer une copie d'une chaîne littérale

Pour imprimer l'adresse de l'objet pointé par le pointeur et l'adresse du pointeur lui-même, vous pouvez utiliser %p formater le caractère pour afficher l’adresse du pointeur.Le code suivant montreoriginalString etcopiedString L'adresse du pointeur et l'adresse pointant vers l'objet :

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

Les résultats d'exécution de Xcode version 15.1 (15C65) et du simulateur (iPhone 15) sont les suivants :

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

expliquer

  • Original: Hello, World! etCopied: Hello, World! Affiche le contenu de la chaîne.
  • Original pointer address: %p Pointeur de sortieoriginalString L'adresse elle-même sur la pile.
  • Copied pointer address: %p Pointeur de sortiecopiedString L'adresse elle-même sur la pile.
  • Original object address: %p sortiroriginalString L'adresse dans le tas de l'objet chaîne pointé.
  • Copied object address: %p sortircopiedString L'adresse dans le tas de l'objet chaîne pointé.

On voit qu'en raison de NSString est un objet immuable et exécutecopy La méthode ne crée pas de nouvel objet, mais renvoie le même objet.doncoriginalString etcopiedString Pointez vers la même adresse mémoire (l'adresse de l'objet est la même), mais leurs pointeurs eux-mêmes ont des adresses différentes sur la pile.


Effectuer mutableCopy sur une chaîne littérale

    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

Les résultats d'exécution de Xcode version 15.1 (15C65) et du simulateur (iPhone 15) sont les suivants :

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