You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现字符串深拷贝并传入NSScanner 避免源值变动异常

问题描述

参考Stack Overflow文章《Convert hex string to long》中的代码,实现从字符串读取long类型值的逻辑。官方示例用的是硬编码字符串,但我实际场景里的字符串取自外部变量,这个变量会出现非预期的变动,所以我想保留初始读取到的数值,把字符串的深拷贝传入NSScanner使用。

我之前了解到[string copy]、[string mutableCopy]提供的是浅拷贝,Stack Overflow问题《NSString copy not copying?》里提到NSString是不可变类型,正常情况下只有指针本身变化时,它指向的内容才会改变。我现在有两个疑问:

  • NSScanner的使用会不会影响NSString的不可变特性?
  • 还是我对这个机制的理解本身就有错误?

实际调试时,原字符串理论上不应该发生变动,但执行几行代码后它的值就出现了异常变化,相关代码和调试断点信息如下。

相关实现代码
NSString* pString = someIdentifier;

unsigned long long val;
NSScanner* scanner = [NSScanner scannerWithString: pString];
[scanner scanHexLongLong: &val];
调试断点观测值

逐行执行代码时,各断点观测到的变量状态如下:

  • 执行到NSString* pString = someIdentifier;行时:pString = @"0x12345"
  • 执行到NSScanner* scanner = [NSScanner scannerWithString: pString];行时:
    • pString = @"9876543"(不符合十六进制字符串格式)
    • val = "74576"(和原始pString解析结果接近、但不完全一致的十进制值)
    • scanner = 0x12b45(和pString指针地址仅1位差异)
  • 执行到[scanner scanHexLongLong: &val];行时:scanner指向之前pString所在的内存地址
  • 代码执行完最后一行时:
    • pString = 0xFFFFF
    • val = 0xFFFFF(十进制值)

内容的提问来源于stack exchange,提问作者ahSatan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:33:21