想要ARC的自动释放生命周期

时间:2015-09-17 16:52:08

标签: ios automatic-ref-counting

在iOS上过渡到ARC。

我有一个自动释放的NSString,用于生成UTF-8表示,并依赖池生命周期来保持UTF-8指针活着:

char *GetStringBuffer(something)
{
    NSString *ns = [NSString stringWithSomething:something];
    return [ns UTF8String];
}

something的性质在这里并不重要。

预ARC规则确保返回的数据指针在当前自动释放池的生命周期内保持有效。至关重要的是,我没有携带NSString指针。

现在,在ARC下,函数返回时不会释放字符串吗?我不认为ARC会认为char *深入NSString内部的结构是一个强大的参考,特别是看到它没有被明确释放过。

这里最好的ARC成语是什么?

2 个答案:

答案 0 :(得分:3)

如果要保证UTF8String的返回值在当前自动释放池耗尽之前有效,则有两种选择:

  1. compiled with ARC disabled的文件中定义GetStringBuffer。如果stringWithSomething:遵循约定,则必须将自动释放的NSString返回给非ARC调用者。如果不是(例如它的行为类似于-[NSArray objectAtIndex:]),则可以明确retainautorelease

  2. 使用免费桥接和CFAutorelease

    char *GetStringBuffer(something) {
        NSString *ns = [NSString stringWithSomething:something];
        CFAutorelease(CFBridgingRetain(ns));
        return [ns UTF8String];
    }
    

答案 1 :(得分:0)

(我不能删除它,因为它已被接受,但这个答案是不正确的。请参阅Rob Mayoff的回答,以及对该答案的评论以获得解释。没有承诺此指针在返回后有效语句。)

重写我的整个答案。不得不挖掘和挖掘,但我相信今天这是惊人的安全(由于我的崩溃导致ARC的改进;我知道这样的东西在我的脑后滚动)。原因如下:

@property (readonly) __strong const char *UTF8String NS_RETURNS_INNER_POINTER;  // Convenience to return null-terminated UTF8 representation

UTF8String标记为NS_RETURNS_INNER_POINTER,实际上是objc_returns_inner_pointer。调用该方法:

  

对象的生命周期将延长至至少最早:

     
      
  • 在调用函数或
  • 中最后一次使用返回的指针或从中派生的任何指针   
  • 自动释放池将恢复到之前的状态。
  •   

这就是你想要它做的事。