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

问题描述 投票:2回答:2

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
2个回答
5
投票

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

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

你得到的UTF-8字符串具有源NSString的生命周期的最大生命周期(ARC将在函数结束时清理),所以如果你需要保持字符串,你需要制作使用strdup或类似的副本(并自己管理一生)。


1
投票

函数结束后指针无效吗?

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.