copy 和 mutableCopy 有点乱

对 string literal (字符串字面量) 执行 copy

要打印指针指向对象的地址和指针本身的地址,可以使用 %p 格式符来输出指针地址。以下代码,展示了 originalStringcopiedString 的指针地址和指向对象的地址:

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);

Xcode Version 15.1 (15C65) & 模拟器(iPhone 15)运行结果如下:

// 打印的内容一样
Original: Hello, World!
Copied: Hello, World!
// 指针本地的地址不一样,说明是不同的指针
Original pointer address: 0x7ff7b1a5fa98
Copied pointer address: 0x7ff7b1a5fa90
// 不同的指针指向同一个对象
Original object address: 0x10e4a0070
Copied object address: 0x10e4a0070

解释

  • 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 方法时并不会产生新的对象,而是返回相同的对象。所以 originalStringcopiedString 指向相同的内存地址(对象地址相同),但是它们的指针本身在栈中的地址是不同的。


对 string literal (字符串字面量) 执行 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);

Xcode Version 15.1 (15C65) & 模拟器(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. copy mutableCopy 有点

    2024-07-12 06:52:04       28 阅读
  2. Dockerfile COPY、ADD 作用区别

    2024-07-12 06:52:04       33 阅读
  3. python 基础:copydeepcopy详解

    2024-07-12 06:52:04       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 06:52:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 06:52:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 06:52:04       57 阅读
  4. Python语言-面向对象

    2024-07-12 06:52:04       68 阅读

热门阅读

  1. Go 1.19 工具链升级:go命令与工具改进详解

    2024-07-12 06:52:04       31 阅读
  2. 暗黑魅力:Xcode全面拥抱应用暗黑模式开发指南

    2024-07-12 06:52:04       27 阅读
  3. 驾驭npm更新之力:深入掌握npm update命令的精髓

    2024-07-12 06:52:04       22 阅读
  4. 港口危险货物安全管理人员考试题库(含答案)

    2024-07-12 06:52:04       27 阅读
  5. 云计算 | 期末梳理(中)

    2024-07-12 06:52:04       24 阅读
  6. C语言5 字符输出函数和格式输出函数

    2024-07-12 06:52:04       25 阅读
  7. vue 使用$router.push传递参数

    2024-07-12 06:52:04       22 阅读
  8. 【面试系列】网络工程师 高频面试题及详细解答

    2024-07-12 06:52:04       28 阅读
  9. 云计算 | 期末梳理(上)

    2024-07-12 06:52:04       20 阅读
  10. vue 级联下拉框选择的思维

    2024-07-12 06:52:04       24 阅读
  11. qt 图形、图像、3D相关知识

    2024-07-12 06:52:04       15 阅读
  12. UVa1459/LA4748 Flowers Placement

    2024-07-12 06:52:04       24 阅读