执行字符串的深度复制以传递到扫描仪的最简单方法?

Easiest way to perform a deep copy of a string to pass to a scanner?

提问人:ahSatan 提问时间:7/3/2022 最后编辑:ahSatan 更新时间:7/4/2022 访问量:76

问:

我遵循此处显示的代码:将十六进制字符串转换为长整形以从字符串中读取长整型。在他们的示例中,他们有一个硬编码的字符串,但在我自己的上下文中,我有另一个值,我正在从中获取字符串,该值似乎发生了变化,但我认为它不应该改变。我想在开始时保留正在读取的值,因此将字符串的深层副本传递给扫描程序。

我知道 [string copy] 和 [string mutableCopy] 提供了一个浅拷贝,而在 NSString 中,副本不复制? 问题 我们指出 NSString 应该是不可变的,因此它发生变化的场景也是它的指针发生变化时。但是,我想知道使用扫描仪是否会导致此前提出现问题?我能完全错误地理解这里的问题吗?我不认为原始字符串甚至不应该改变,但在调试器中,它在几行后就发生了变化。

1 NSString* pString = someIdentifier;
2
3 unsigned long long val;
4 NSScanner* scanner = [NSScanner scannerWithString: pString];
5 [scanner scanHexLongLong: &val];
6 
Debug breakpoints
1 pString = @"0x12345"
4 pString = @"9876543" (not exactly a hex string)
  val = "74576" (some decimal close to, but not the same as the original pString)
  scanner = 0x12b45 (same a pString with 1 bit different)
5 scanner = previous pString
6 pString = 0xFFFFF 
  val = 0xFFFFF ( in decimal) 
Objective-C 十六进制 nsstring 深拷贝 nsscanner

评论

1赞 Willeke 7/3/2022
链接问题的答案是:如果字符串不可变,则不会复制字符串。因此,要么复制字符串,要么字符串无法更改。为什么你的字符串是不可变的?您是否尝试过复制字符串?
1赞 Willeke 7/3/2022
您如何以及何时获取变量的值?变量的值应该是多少?什么回报?是错别字吗?[pScanner scanHexLongLong: &val]pScanner
1赞 Cristik 7/4/2022
深拷贝/浅拷贝对字符串没有意义,这些概念适用于容器对象(数组、包含指向其他对象的指针的对象等)。您的问题是否与保存字符串内容的缓冲区被复制或未被复制有关?您能否给我们一个最小的可重复示例,以便我们更好地了解您的问题?
0赞 ahSatan 7/4/2022
@Willeke pScanner 是问题中的错别字,我已经编辑过了。至于为什么我的字符串是不可变的,我认为这是因为它是 NSString。我使用 xcode 调试器检查了变量的值,基本上每行都有断点。在传递到扫描程序后,pString 会立即更改。[pScanner scanHexLongLong: &val] 返回 pString 的新值。val 在这一点上仍然是原始的,但在下一行中变成了它返回的内容(我认为这部分是有道理的)
2赞 Cristik 7/4/2022
似乎您正在将更改其内容和更改其值的指针混为一谈。这是两种不同的行为,我认为你对后者有问题。此外,我在代码片段中没有看到字符串可以更改的任何可能来源,这就是为什么我要求在那里提供更多上下文的原因。也许尝试将调试器指令转换为 Objective-C 代码行?NSStringNSString *

答: 暂无答案