기술나눔

copy와 mutableCopy는 약간 혼란스럽습니다.

2024-07-12

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

문자열 리터럴의 복사본을 수행합니다.

포인터가 가리키는 객체의 주소와 포인터 자체의 주소를 인쇄하려면 다음을 사용할 수 있습니다. %p 포인터 주소를 출력하려면 문자 형식을 지정하십시오.다음 코드는 다음을 보여줍니다.originalString 그리고copiedString 포인터 주소와 객체를 가리키는 주소:

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

Xcode Version 15.1(15C65) & Simulator(iPhone 15)의 실행 결과는 다음과 같습니다.

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

설명하다

  • Original: Hello, World! 그리고Copied: Hello, World! 문자열 내용을 출력합니다.
  • Original pointer address: %p 출력 포인터originalString 스택의 주소 자체입니다.
  • Copied pointer address: %p 출력 포인터copiedString 스택의 주소 자체입니다.
  • Original object address: %p 산출originalString 가리키는 문자열 개체의 힙에 있는 주소입니다.
  • Copied object address: %p 산출copiedString 가리키는 문자열 개체의 힙에 있는 주소입니다.

때문이라고 볼 수 있다 NSString 불변 객체이며 실행됩니다.copy 메서드는 새 객체를 생성하지 않지만 동일한 객체를 반환합니다.그래서originalString 그리고copiedString 동일한 메모리 주소(객체 주소는 동일함)를 가리키지만 해당 포인터 자체는 스택에서 다른 주소를 갖습니다.


문자열 리터럴에서 mutableCopy 수행

    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

Xcode Version 15.1(15C65) & Simulator(iPhone 15)의 실행 결과는 다음과 같습니다.

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