【发布时间】:2010-06-19 04:27:16
【问题描述】:
文档含糊地说,只要需要,它就会一直存在,但它什么时候真正被解除分配?原始 NSString 何时被释放?当前的自动释放池何时清除?别的时候?此外,与当前的实施相比,它何时可以保证保留?如果它在 NSString 的生命周期内一直存在,是否每次都返回相同的指针?
谢谢
【问题讨论】:
标签: objective-c memory-management nsstring
文档含糊地说,只要需要,它就会一直存在,但它什么时候真正被解除分配?原始 NSString 何时被释放?当前的自动释放池何时清除?别的时候?此外,与当前的实施相比,它何时可以保证保留?如果它在 NSString 的生命周期内一直存在,是否每次都返回相同的指针?
谢谢
【问题讨论】:
标签: objective-c memory-management nsstring
2018 年 11 月 30 日更新
正如 David Dunham 在 cmets 中指出的那样,Apple 文档已更改(我的答案中的旧链接现已损坏)。
Apple documentation 现在说:
这个C字符串是一个指向字符串对象内部结构的指针,它的生命周期可能比字符串对象短,而且肯定不会有更长的生命周期。因此,如果需要将 C 字符串存储在使用此属性的内存上下文之外,则应复制它。
我原来的答案现在有两部分是错误的。
我声称 UTF8 字符串可能在 NSString 的释放后仍然存在,但当前的 Apple 文档明确否认了这一说法。
在 Apple 文档中,“自动释放上下文”已替换为“内存上下文”。我不确定这到底是什么意思,但在退出获取指针的范围后,您可能不应该信任指针。
原始答案
Apple documentation (broken link) 说:
返回的 C 字符串会自动释放,就像释放返回的对象一样;如果需要将 C 字符串存储在创建 C 字符串的自动释放上下文之外,则应该复制它。
这对我来说似乎并不含糊。
NB 你不应该真正担心当前的实现是做什么的。实现改变
推断以上内容,您的问题的答案可能是:
但它实际上是在什么时候被释放的呢?
当自动释放池耗尽时。
原始 NSString 何时被释放?
没有。该文档暗示您可以分配一个字符串,获取 UTF8String 然后释放该字符串,UTF8String 仍然有效但请注意Memory Management Rules 中的这一行:
接收到的对象通常保证在接收到的方法中保持有效......尽管您也必须小心修改从其中接收到另一个对象的对象。
“修改对象”可能包括释放您从中获取 UTF8 字符串的 NSString。
当前的自动释放池何时清除?
文档是这么说的。
其他时间?
没有。
此外,与当前的实施相比,它可以保证保留到什么时候?
如果没有记录,则无法保证。
如果它在 NSString 的生命周期内一直存在,是否每次都返回相同的指针?
我对此表示怀疑。也许对于不可变字符串,UTF8 字符串会被缓存,但可能不会。为什么不写一些代码来试试呢?在任何情况下,你都不能在生产代码中依赖它,也不能在你的 NSString 可能真的是 NSMutableString 的任何情况下。
【讨论】:
这通常发生在 NSAutoreleasePool 收到 -drain 消息时,假设没有延迟引用。
【讨论】: