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,使指针无效。
答案 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
成为字符串。