copy 和 mutableCopy 有点乱

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

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

objc 复制代码
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

objc 复制代码
    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
相关推荐
冰淇淋真好吃3 小时前
iOS实现 WKWebView 长截图的优雅方案
ios
前端不太难8 小时前
Flutter / RN / iOS,在长期维护下的性能差异本质
flutter·ios
搜狐技术产品小编20231 天前
精通 UITableViewDiffableDataSource——从入门到重构的现代 iOS 列表开发指南
ios·重构
tangweiguo030519871 天前
SwiftUI 状态管理完全指南:从 @State 到 @EnvironmentObject
ios
Digitally1 天前
如何轻松地将文件从 PC 传输到 iPhone
ios·iphone
iosTiov1 天前
当IPA遇见信任:解密ios生态中“签名”的真正力量
ios·团队开发·苹果签名·稳定
游戏开发爱好者81 天前
如何使用 AppUploader 提交上传 iOS 应用
android·ios·小程序·https·uni-app·iphone·webview
和沐阳学逆向1 天前
iOS 18 越狱教程:palera1n + 巨魔安装全流程
ios·巨魔商店·ios越狱·ios18越狱
ii_best2 天前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
先飞的笨鸟2 天前
2026 年 Expo + React Native 项目接入微信分享完整指南
前端·ios·app