ARC是否跟踪[NSString UTF8String]生成的const char *?

时间:2018-01-03 17:16:59

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

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跟踪它?

2 个答案:

答案 0 :(得分:5)

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

  

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

您获得的UTF-8字符串具有源NSString生命周期的最长生命周期(ARC将在函数末尾清理),因此如果您需要保留字符串,您需要使用strdup或类似内容制作副本(并自行管理生命周期)。

答案 1 :(得分:1)

  

函数结束后指针是否无效?

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

  

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

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