NSString的cStringUsingEncoding返回值的寿命(Lifespan of NS

2019-10-22 13:04发布

我有一个的NSTextField并获得它的内容,像这样

NSString *s = [textField stringValue]

现在我想这个的NSString转换为我的独立于平台的C代码可以处理的字符串。 因此,我在做:

const char *cstr = [s cStringUsingEncoding:NSISOLatin1StringEncoding];

我不明白,现在这个“CSTR”指针保持多久有效。 苹果文档的cStringUsingEncoding说:

返回的C字符串被保证是唯一有效,直到该接收器被释放时,或直到当前存储器被清空,以先到者为准。 您应该复制的C字符串或使用getCString:最大长度:编码:如果需要存储C字符串超出这个时间。

这个两个问题:

  1. 我想上述“接收器”是由[文本字段stringValue的]返回的NSString。 由于我并不拥有这个NSString的我怎么能知道何时会被释放? 它是安全的假设,这个的NSString不会被释放的窗口小部件的NSTextField将释放之前?

  2. 是什么“直到目前的内存空”的意思准确? 我完全不明白这一点。

当然,我可能只是继续前进,使副本,但我想了解由cStringUsingEncoding返回的字符串指针的有效期。

我知道这里有几个类似的问题,但没有人能真正回答我的问题,因为在我的情况,NSString的所有者是的NSTextField控件,我不知道什么时候这个小部件将释放的NSString,或者如果它保持有效完整寿命的部件本身。

Answer 1:

我想上述“接收器”是NSString由返回[textField stringValue]

是的,在这种情况下,接收器是s

由于我并不拥有这个NSString我怎么能知道何时会被释放?

你不知道。 你应该保留s在一个实例变量保存它,只要你需要它

它是安全的假设,这个NSString不会被释放的前NSTextField部件将被释放?

没有,因为你不知道什么或如何返回到文本字段s给你

是什么“直到目前的内存空”的意思准确? 我完全不明白这一点。

好问题。 同样,很难说,因为你没有自己的字符串或知道它的底层实现。 说它是突变,不得不重新分配内存一个可变的字符串...

您可以确信您的安全,如果你copy s的副本存储在一个实例变量,然后使用复制来获取C字符串(或只复制C字符串)。



Answer 2:

接收器肯定是指串s和危险cstr时是明确的s被释放。 我想起那句“或直至当前内存走光”是ARC推出的文档错误。 它可以被理解为“或直到执行了ARC-隐含释放”。

看到该文档, 这里列出 2010年作为证据。 我觉得作者,可能搜索“自动释放池”的地方,以更新文档,是抓为“或直至当前的自动释放池清空”无害,ARC兼容的代名词。 我认为它会更好,只是下降的脱节。

总之,无论是走的NSString的控制,或复制的CString。



文章来源: Lifespan of NSString cStringUsingEncoding return value