【问题标题】:Does ARC keep track of the const char* produced by [NSString UTF8String]?ARC 是否跟踪 [NSString UTF8String] 生成的 const char*?
【发布时间】:2018-06-13 09:44:47
【问题描述】:

const char* 有效吗? ARC 是否跟踪此函数返回的指针?

const char* getUrl()
{
    // retrieve an url with obj-c
    NSString *maybeTmp = [[NSString alloc] initWithString:@"some url"];
    return [maybeTmp UTF8String];
}

此代码用作桥梁。 C 库将调用此函数。

我猜 ARC 不会跟踪那个指针,一旦函数 getUrl() 返回就会释放这个 NSString,使指针无效。

  • 函数结束后指针是否无效?
  • 如果无效,是否有办法明确要求 ARC 对其进行跟踪?

【问题讨论】:

    标签: objective-c c automatic-ref-counting


    【解决方案1】:

    不,ARC 不(也不能)管理非对象类型的生命周期。如果你看看documentation for -[NSString UTF8String],你还可以看到以下内容:

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

    您返回的 UTF-8 字符串的最大生命周期是源 NSString 的生命周期(ARC 将在函数结束时清理),所以如果您需要保留该字符串,您'将需要使用strdup 或类似方法制作副本(并自己管理生命周期)。

    【讨论】:

    • 确实,该文档非常不言自明。所以这意味着我应该只使用 UTF8String 将该 C 字符串复制到其他地方,即使 NSString 的生命周期还没有结束?我没想到会这样,谢谢
    • 是的,我只是对文档which may have a lifetime shorter than the string object 的那部分感到惊讶,这基本上意味着即使我在某处保持 NSString 处于活动状态(假设使用静态或作为全局变量),指针可能在某个时间点失效
    • @itMaxence 抱歉,删除了我的原始评论,而不是像我想要的那样编​​辑它。这可能发生在各种罕见的情况下(您有 很多 标记的指针字符串,在紧密循环中获取它们的所有 UTF8String 值,并在使用 UTF8String 值之前耗尽当前的自动释放池) ,但这种情况极为罕见。
    • @itMaxence 如果你想真正安全,是的,在使用它之前复制 UTF-8 字符串,当然在将值传递给不同的函数之前这样做(可以做任何他们想做的事) .
    • 基本上,在自动释放池内调用-UTF8String,然后在自动释放池外使用结果并不总是安全的。如果您调用 -UTF8String 并在相同的范围内使用它(没有对您的自动释放池做一些繁琐的事情,这在 ARC 中即使不是不可能也非常困难),您应该是安全的。
    【解决方案2】:

    函数结束后指针无效吗?

    你是对的。 ARC 只跟踪分配给引用计数对象的内存。 UTF8String 返回的 Sinc char* 不引用引用计数对象,ARC 不知道它的存在。

    如果无效,有没有办法明确要求 ARC 跟踪它?

    不,因为char* 缺少用于保持引用计数的“基础设施”。您可以返回一个包含您的char* 的引用计数对象,或者使用malloc,制作一个副本,然后让调用者free 字符串。

    【讨论】:

    • 如何将指针的retain count加1,使NSString不释放?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多