如何在GC下处理返回的C类型的内存?

Chr*_*eux 8 cocoa garbage-collection objective-c

根据NSString的方法文档-UTF8String:

返回的C字符串将自动释放,就像返回的对象将被释放一样; 如果需要将C字符串存储在创建C字符串的自动释放上下文之外,则应复制C字符串.

所以在retain/release内存管理下,有以下方法:

- (const char*) giveMeACString
{
    NSString* string = @"I'm a string!";
    return [string UTF8String];
}
Run Code Online (Sandbox Code Playgroud)

是好的,只要调用方法处理返回的const char*,就像它自动释放的对象一样.

但是,根据我的意识,在垃圾收集下没有自动释放上下文.并且C类型不是垃圾收集的,因此它看起来不像GC那样会将返回的指针视为返回的对象.

它的生命周期是什么?它是否仍然在线程的runloop中可靠地"稍后"释放,或者它在GC下的行为与非GC下的行为不同?

Jer*_*myP 2

我认为内存是从垃圾收集的内存中分配的,返回类型是__strong const char*. 这意味着当无法从根指针集中到达时,将以正常方式收集它。

这基本上意味着您需要将其存储在标记为的指针变量中,__strong否则它将在某个时刻被收集。

我推测不可变字符串维护对其自身 UTF8 版本的引用,因此它只需要计算一次,因此 UTF8 字符串可能不会消失,直到 NSString 消失,这就是为什么你不必这样做担心它会正常消失。