【问题标题】:Want Autorelease lifetime with ARC希望使用 ARC 自动释放生命周期
【发布时间】:2015-09-17 16:52:08
【问题描述】:

在 iOS 上过渡到 ARC。

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

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

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

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

现在,在ARC下,函数返回时字符串不会被释放吗?我不认为 ARC 会认为 char * 指向 NSString 深处的结构是一个强引用,尤其是考虑到它从来没有被明确地释放过。

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

【问题讨论】:

  • 您对 ARC 下的代码有疑问吗? ns 仍然在 ARC 下自动发布。
  • 是的,但问题是何时
  • ARC 不会改变自动释放的工作方式。在这方面没有任何变化。 ARC 所做的只是在需要时隐式添加 releaseretain。听起来您正在担心一个实际上不存在或您没有遇到过的问题。
  • 换句话说,你的代码没问题。
  • 那么用 [objectWithXXX] 分配的 Cocoa 对象的生命周期还是和以前一样?

标签: ios automatic-ref-counting


【解决方案1】:

如果你想保证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];
    }
    

【讨论】:

【解决方案2】:

(我无法删除它,因为它已被接受,但此答案不正确。请参阅 Rob Mayoff 的答案,以及该答案上的 cmets 以获得解释。无法保证此指针在返回后仍然有效声明。)

重写我的整个答案。不得不挖掘和挖掘,但我相信今天这是出奇的安全(由于自从我发生车祸以来 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。调用该方法:

对象的生命周期将至少延长到以下最早的时间:

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

这几乎就是你想要的。

【讨论】:

  • 对此有 iOS 版本限制吗?
  • 这里的问题是ARC被允许在他的GetStringBuffer函数返回后立即释放NSString,因为这是你引用的第一个要点。
  • @SevaAlekseyev 我认为它至少回到了 iOS 6。它不是最近的,但您必须查看发行说明才能准确了解。
  • @robmayoff 问题是返回指针是否算作创建派生指针。我认为确实如此(尽管我没有该立场的证据)。
猜你喜欢
  • 2011-09-04
  • 2013-02-17
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多