什么是 - [NSString UTF8String]的保证生命周期?

时间:2010-06-19 04:27:16

标签: objective-c memory-management nsstring

文档模糊地说,只要需要它就会坚持下去,但什么时候才能解除分配呢?当原始NSString被解除分配?当前自动释放池清除?还有其他时间?此外,与当前实施相比,何时保证保留?如果它保持NSString的生命周期,每次都会返回相同的指针吗?

由于

2 个答案:

答案 0 :(得分:5)

更新30/11/2018

正如David Dunham在评论中指出的那样,Apple文档发生了变化(我的答案中的旧链接现已被破坏)。

Apple documentation现在说:

  

此C字符串是指向字符串对象内部结构的指针,该结构的生命周期可能短于字符串对象,并且肯定不会有更长的生命周期。因此,如果需要将C字符串存储在使用此属性的内存上下文之外,则应复制该字符串。

我原来的答案现在分两部分错了。

当前的Apple文档明确否认了我声称UTF8字符串可能在NSString的重新分配后存活的说法。

在Apple文档中,“自动释放上下文”已被“内存上下文”取代。我不确定这究竟是什么意思,但是在你退出获取它的范围后,你可能不应该相信指针。

原始答案

Apple documentation (broken link)说:

  

返回的C字符串会自动释放,就像释放返回的对象一样;如果需要将C字符串存储在创建C字符串的自动释放上下文之外,则应复制C字符串。

这对我来说似乎非常模糊。

注意:您不应该真正担心当前的实现方式。实施改变

根据上述内容,您的问题的答案可能是:

  

但什么时候才真正解除分配?

当自动释放池耗尽时。

  

当原始NSString被解除分配时?

没有。文档暗示你可以分配一个字符串,接受UTF8String然后释放字符串,UTF8String仍然有效要注意Memory Management Rules中的这一行:

  

通常保证收到的对象在收到的方法中保持有效...尽管如果修改了从中接收另一个对象的对象,也必须小心。

“修改对象”可能包括释放你从中获得UTF8字符串的NSString。

  

当前自动释放池清除后?

这就是文档所说的。

  

其他时间?

没有

  

此外,与当前实施相比,何时保证保留?

如果没有记录,则无法保证。

  

如果它保持NSString的生命周期,每次都会返回相同的指针吗?

我对此表示怀疑。也许对于不可变字符串,UTF8字符串是缓存的,但可能不是。为什么不写一些代码来试试呢?在任何情况下,您都不能在生产代码中依赖它,也不能在NSString可能真的是NSMutableString的任何情况下依赖它。

答案 1 :(得分:0)

通常,当NSAutoreleasePool收到-drain消息时,会发生这种情况,假设没有延迟引用。

修改:Link to 'the rules'