【问题标题】:Lifespan of NSString cStringUsingEncoding return valueNSString cStringUsingEncoding 返回值的生命周期
【发布时间】:2015-04-06 15:05:08
【问题描述】:

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

NSString *s = [textField stringValue]

现在我想将此 NSString 转换为我的平台无关 C 代码可以处理的字符串。因此我正在这样做:

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

我现在不明白这个“cstr”指针保持有效的时间有多长。 cStringUsingEncoding 的 Apple 文档说:

保证返回的 C 字符串仅在 接收器被释放,或者直到当前内存被清空,以哪个为准 首先发生。您应该复制 C 字符串或使用 getCString:maxLength:encoding: 如果需要存储C字符串 超过这个时间。

关于这个的两个问题:

  1. 我想前面提到的“接收者”是 [textField stringValue] 返回的 NSString。既然我不拥有这个 NSString ,我怎么知道它什么时候会被释放?假设在释放 NSTextField 小部件之前不会释放此 NSString 是否安全?

  2. “直到当前内存被清空”是什么意思?我完全不明白。

当然,我可以直接复制一份,但我想了解 cStringUsingEncoding 返回的字符串指针的有效时间。

我知道这里有几个类似的问题,但没有人能真正回答我的问题,因为在我的情况下,NSString 的所有者是 NSTextField 小部件,我不知道这个小部件何时会释放 NSString 或者它是否保持有效对于小部件本身的整个生命周期。

【问题讨论】:

    标签: objective-c cocoa nsstring


    【解决方案1】:

    我想前面提到的“接收者”是NSString返回的[textField stringValue]

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

    既然我不拥有这个NSString,我怎么知道它什么时候会被释放?

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

    假设在释放NSTextField 小部件之前不会释放此NSString 是否安全?

    不,因为您不知道文本字段向您返回 s 的内容或方式

    “直到当前内存被清空”究竟是什么意思?我完全不明白。

    好问题。另外,很难说,因为您不拥有该字符串或不了解其底层实现。说它是一个可变字符串,它发生了变异,必须重新分配内存......

    如果您 copy s 将副本存储在实例变量中,然后使用该副本获取 C 字符串(或仅复制 C 字符串),您可以非常确定自己的安全。

    【讨论】:

    • 谢谢,我还有一个关于保留的问题,但我认为这是一个新问题。
    【解决方案2】:

    接收者肯定是指字符串s,当s 被释放时,cstr 的危险就很明显了。我认为“或直到当前内存被清空”这句话是 ARC 引入的文档错误。它可以读作“或直到执行 ARC 隐含的版本”。

    请参阅 2010 年的文档 quoted here 作为证据。我认为作者可能正在寻找“自动释放池”来更新文档的地方,正在寻找一个无害的、与 ARC 兼容的同义词,即“或直到当前的自动释放池被清空”。我认为最好放弃析取。

    不管怎样,要么控制 NSString,要么复制 cstring。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-23
      • 1970-01-01
      • 2021-05-31
      • 2023-03-24
      • 1970-01-01
      • 2018-09-09
      • 2021-09-13
      相关资源
      最近更新 更多