文档模糊地说,只要需要它就会坚持下去,但什么时候才能解除分配呢?当原始NSString被解除分配?当前自动释放池清除?还有其他时间?此外,与当前实施相比,何时保证保留?如果它保持NSString的生命周期,每次都会返回相同的指针吗?
由于
答案 0 :(得分:5)
更新30/11/2018
正如David Dunham在评论中指出的那样,Apple文档发生了变化(我的答案中的旧链接现已被破坏)。
此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
消息时,会发生这种情况,假设没有延迟引用。