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

Does ARC keep track of the const char* produced by [NSString UTF8String]?

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() returns 就会释放这个 NSString,使指针无效。

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

This C string is a pointer to a structure inside the string object, which may have a lifetime shorter than the string object and will certainly not have a longer lifetime. Therefore, you should copy the C string if it needs to be stored outside of the memory context in which you use this property.

您返回的 UTF-8 字符串具有源生命周期的最大生命周期 NSString(ARC 将在函数结束时清理),因此如果您需要坚持字符串,您需要使用 strdup 或类似方法(并自己管理生命周期)进行复制。

Is the pointer non-valid after the end of the function?

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

If non-valid, is there a way to explicitly ask ARC to keep track of it?

否,因为 char* 缺少 "infrastructure" 来保持引用计数。您可以 return 一个包含您的 char* 的引用计数对象,或者使用 malloc,制作一个副本,然后让调用者 free 字符串。