Jar*_*tar 5 memory-management objective-c nsstring
文档模糊地说,只要需要它就会坚持下去,但什么时候才能解除分配呢?当原始NSString被解除分配?当前自动释放池清除?还有其他什么?此外,与当前实施相比,何时保证保留?如果它保持NSString的生命周期,每次都会返回相同的指针吗?
谢谢
更新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的任何情况下依赖它.
| 归档时间: |
|
| 查看次数: |
2250 次 |
| 最近记录: |