【问题标题】:What happens with ARC and an Objective C object inside a C++ object?ARC 和 C++ 对象中的 Objective C 对象会发生什么?
【发布时间】:2014-06-19 19:11:38
【问题描述】:

我很惊讶这个编译没有错误。 ARC刚问世时,我不认为它曾经如此。

class SessionWriter
{
    NSString *sessionDir;
    ...
};

看起来NSString 是由 ARC 在析构函数中释放的。这是在哪里记录的?

【问题讨论】:

    标签: c++ objective-c automatic-ref-counting


    【解决方案1】:

    一般来说,Objective-C++ 的文档记录很差。除了 Apple 的高级教程和低级 API 列表之外,Objective-C 2.0 语言本身缺乏正式的规范,而 Objective-C++ 则更少。从广义上讲,您似乎应该相信在 C 和 C++ 作为基础语言之间的转换过程中,事情在逻辑上“有效”。

    Clang ARC 文档确实是 touch on this a bit,尽管它们实际上是在描述 Objective-C 和 Objective-C++ 结构而不是 C++ 类之间的行为差​​异。不过,这很清楚,ARC 确实适用于 Objective-C++ 聚合。

    非普通的所有权限定类型被认为是非 POD:在 C++11 术语中,它们不是普通的默认可构造、可复制构造、可移动构造、可复制分配、可移动分配或可破坏。使用 ARC 之外的类违反 C++ 的单一定义规则,在 ARC 下,该类将具有非平凡的所有权限定成员。

    基本原理

    与 C 不同,我们可以将所有权限定子对象的所有必要 ARC 语义表达为类的(默认)特殊成员函数的子操作。这些功能然后变得不平凡。这具有非显而易见的结果,即该类将具有非平凡的复制构造函数和非平凡的析构函数;如果这在 ARC 之外通常不成立,则该类型的对象将以与 ABI 不兼容的方式传递和返回。

    【讨论】:

    • 这有帮助。关于单一定义规则的那句话让我感到困惑。你能解释一下为什么在 ARC 之外使用这个类会是一个问题吗?是不是因为非 ARC 翻译单元可能会尝试内联析构函数并最终以不同的方式编写它,而在这种情况下没有 release
    • 不一定要内联析构函数,因为 Clang 必须生成 cum 和 sine ARC 类的两个不同定义。
    • 为什么需要这样做?如果某个类Foo 使用ARC 编译,那么它的析构函数将使用ARC,而ARC 关闭的Foo 的客户端仍然会调用Foo 的析构函数并获得正确的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2011-04-29
    • 1970-01-01
    相关资源
    最近更新 更多