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不会(也不能)管理非对象类型的生命周期。如果你看看documentation for -[NSString UTF8String]
,你还可以看到以下内容:
此C字符串是指向字符串对象内部结构的指针,该结构的生命周期可能短于字符串对象,并且肯定不会有更长的生命周期。因此,如果需要将C字符串存储在使用此属性的内存上下文之外,则应将其复制。
你得到的UTF-8字符串具有源NSString
的生命周期的最大生命周期(ARC将在函数结束时清理),所以如果你需要保持字符串,你需要制作使用strdup
或类似的副本(并自己管理一生)。
函数结束后指针无效吗?
你是对的。 ARC仅跟踪分配给引用计数对象的内存。由char*
返回的Sinc UTF8String
并未提及参考计数对象,ARC不知道其存在。
如果无效,有没有办法明确要求ARC跟踪它?
不,因为char*
缺乏保留引用计数的“基础设施”。您可以返回一个包含char*
的引用计数对象,或使用malloc
,制作副本,然后让调用者free
为字符串。