2015-04-06 113 views
1

的寿命我有一个的NSTextField并获得它的内容,像这样的NSString cStringUsingEncoding返回值

NSString *s = [textField stringValue] 

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

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

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

返回的C字符串是保证有效期至要么 接收器被释放,或直到当前内存被清空,先发生 。您应该复制C字符串或使用 getCString:maxLength:encoding:如果它需要在此时间之后存储C字符串 。这个

两个问题:

  1. 我想前面提到的 “接收器” 是由[文本字段stringValue的]返回的NSString。由于我不拥有这个NSString,我怎么知道它何时会被释放?假设这个NSString在NSTextField部件被释放之前不会被释放是否安全?

  2. “直到当前内存被清空”是什么意思?我根本不明白这一点。

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

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

回答

1

我想前面提到的“接收器”是由[textField stringValue]

返回NSString是,在这种情况下,接收器是s

既然我并不拥有这个NSString如何我可以告诉我什么时候能够释放?

你没有。你应该将它存储在一个实例变量,只要你需要保留s

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

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

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

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

您可以确信您的安全,如果你copys,存储复制到一个实例变量,然后使用复制来生成C字符串(或者只是复制C字符串)。

+1

谢谢,我有关于保留的另一个问题,但我认为这是一个新的问题。 – Andreas

0

接收方确认意味着字符串s,并且当s被释放时cstr的危险是明确的。我认为短语“或直到当前内存被清空”是由ARC引入的文档错误。它可以被解读为“或者直到执行一个ARC暗示的释放”。

请参阅2010年的文档quoted here作为证据。我认为作者可能正在寻找'autorelease pool'来更新文档,并且正在抓住一个无害的,与ARC兼容的同义词“或者直到当前的自动释放池被清空”。我认为放弃这种分离会更好。

无论如何,要么控制NSString,要么复制cstring。