说我有以下代码......
let x = "ABCDE"
// 'x' is a String
var y = x[1...3]
// 'y' is a Substring that equals "BCD"
如果您只能访问y
,是否可以访问x
范围之外的x
或y
部分内容? (即您可以访问“A”或“E”,还是增加y
的范围?)
答案 0 :(得分:1)
所以这就是Apple所说的:
重要
不要存储超过您需要的子字符串来执行特定的子字符串 操作。子字符串包含对整个存储的引用 字符串它来自,而不仅仅是它所呈现的部分,即使是 原始字符串没有其他引用。存储子串 因此,可能会延长不再使用的字符串数据的生命周期 否则可以访问,这可能看起来是内存泄漏。
现在我发现他们在最后一句中使用“否则”这个词相当有趣。在我看来,在这个问题上保持开门 - 是否可以操纵子串扩展为包括我们知道仍然作为原始字符串的一部分存在的任何一侧的内存?
所以我认为这是一个公平的考验:
let x = "ABCDEFGH"
let substr = x.prefix(3)
var substrIndex = substr.startIndex
substr.formIndex(&substrIndex, offsetBy: 4) // offset beyond the substring
let prefix = substr.prefix(through:substrIndex)
print(prefix)
那么我认为会打印什么? 实际上我们从来没有打印过。我们得到了运行时致命错误。
Thread 1: Fatal error: Operation results in an invalid index
BTW,即使尝试以下结果导致EXC_BAD_ACCESS崩溃:
let x = "ABCDEFGH"
var substr = x.prefix(3)
withUnsafePointer(to: &substr)
{ substrPointer in
let z = substrPointer.advanced(by: 3)
print(z.pointee)
}
所以我认为如果你只是从Substring或String类中有一个子字符串,或者甚至处理不安全的指针,那么就没有办法找到字符串的其余部分。我确信有一种方法可以使用直接内存访问,因为Apple声称其余的String内存都存在......但你可能不得不回归到C或C ++。