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

Jar*_*tar 5 memory-management objective-c nsstring

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

谢谢

Jer*_*myP 5

更新30/11/2018

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

苹果的文档现在说:

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

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

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

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

原始答案

苹果的文档(断链)说:

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

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

注意:您不应该真正担心当前的实现方式.实施方式发生变化

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

但什么时候实际解除分配?

当自动释放池耗尽时.

当原始NSString被解除分配?

不.文档暗示您可以分配一个字符串,接受UTF8String然后释放字符串,UTF8String仍然有效,要注意内存管理规则中的这一行:

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

"修改对象"可能包括释放您从中获取UTF8字符串的NSString.

当前自动释放池清除?

这就是文档所说的.

还有其他什么?

没有.

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

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

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

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