【发布时间】:2014-06-19 19:11:38
【问题描述】:
我很惊讶这个编译没有错误。 ARC刚问世时,我不认为它曾经如此。
class SessionWriter
{
NSString *sessionDir;
...
};
看起来NSString 是由 ARC 在析构函数中释放的。这是在哪里记录的?
【问题讨论】:
标签: c++ objective-c automatic-ref-counting
我很惊讶这个编译没有错误。 ARC刚问世时,我不认为它曾经如此。
class SessionWriter
{
NSString *sessionDir;
...
};
看起来NSString 是由 ARC 在析构函数中释放的。这是在哪里记录的?
【问题讨论】:
标签: c++ objective-c automatic-ref-counting
一般来说,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 不兼容的方式传递和返回。
【讨论】:
release?
Foo 使用ARC 编译,那么它的析构函数将使用ARC,而ARC 关闭的Foo 的客户端仍然会调用Foo 的析构函数并获得正确的行为。