【问题标题】:What is the guaranteed lifecycle of -[NSString UTF8String]?-[NSString UTF8String] 的保证生命周期是多少?
【发布时间】:2010-06-19 04:27:16
【问题描述】:

文档含糊地说,只要需要,它就会一直存在,但它什么时候真正被解除分配?原始 NSString 何时被释放?当前的自动释放池何时清除?别的时候?此外,与当前的实施相比,它何时可以保证保留?如果它在 NSString 的生命周期内一直存在,是否每次都返回相同的指针?

谢谢

【问题讨论】:

    标签: objective-c memory-management nsstring


    【解决方案1】:

    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 的任何情况下。

    【讨论】:

    • FWIW,Apple 文档已更改,这表明实现也已更改:此 C 字符串是指向字符串对象内部结构的指针,其生命周期可能比字符串对象短并且肯定不会有更长的寿命。因此,如果需要将 C 字符串存储在使用此属性的内存上下文之外,则应复制它。
    • @DavidDunham 感谢您的更新。我已经修改了答案(并包含了一个工作链接)。
    • 我记得你引用的文档,所以得知它发生了变化,我很惊讶。我不得不采取一些预防措施,因为我在不寻常的情况下遇到了一定是终身问题。 (我认为大多数时候,您使用 UTF8String 将某些内容传递给 C 函数,您无需担心。)
    【解决方案2】:

    这通常发生在 NSAutoreleasePool 收到 -drain 消息时,假设没有延迟引用。

    编辑:Link to 'the rules'

    【讨论】:

    • 这也非常模糊,例如,挥之不去的提及什么? iPhone 上没有 CG,所以你说的是保留到 NSString 吗?
    • 我假设对规则有些熟悉。编辑帖子以与他们链接。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2016-02-15
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2016-07-20
    相关资源
    最近更新 更多