如何实现字符串深拷贝并传入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 = 0xFFFFFval = 0xFFFFF(十进制值)
内容的提问来源于stack exchange,提问作者ahSatan
相关产品推荐
相关产品推荐

