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 跟踪它?
不,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
字符串。
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 跟踪它?
不,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
字符串。