1

我对以下短语中的“否则”和“只要”用法感到困惑;

否则,只要实现方法遵循静态类型的签名,ARC 就不会强制执行 Objective-C 类型系统。如果 ARC 暴露于无效指针,则这是未定义的行为。

就 ARC 而言,有效对象是具有“良好行为”保留操作的对象。具体来说,对象的布局必须使 Objective-C 消息发送机制可以成功地向它发送以下消息:

  • 保留,不带参数并返回指向对象的指针。
  • 释放,不带参数并返回 void。
  • 自动释放,不带参数并返回指向对象的指针。

http://clang.llvm.org/docs/AutomaticReferenceCounting.html

我们可以推断出以下内容;

...(忘记其他情况)...如果实现方法遵循静态类型的签名,ARC 将强制执行 Objective-C 类型系统。

它是在谈论保留,释放,自动释放方法的签名吗?如果有,是否有否定意义?

如果实现方法遵循静态类型的签名,ARC 将_不_强制执行 Objective-C 类型系统。

4

2 回答 2

1

第一段

这是一个具有“块指针类型”的“可保留对象指针”变量:

void (^blockPointerTypeVariable)(int);

如果你设置blockPointerTypeVariable指向不是块的东西,你的程序的行为是未定义的。(您可以将其设置为指向具有不同类型签名的块,而不会违反 ARC 的要求。但您不能将其设置为指向 a UIView。)

这是一个带有“<code>Class type”的“可保留对象指针”变量:

Class someClass;

这是一个“可保留对象指针”变量,其“<code>Class type”是“协议限定的”:

Class<SomeProtocol> someClassWithProtocol;

如果你设置someClasssomeClassWithProtocol指向不是 a 的东西,Class你的程序的行为是未定义的。(因此您可以将其设置为[self class]or [UIView class],但不能将其设置为指向 的实例UIView。)

这是一个“可保留对象指针”变量,它不是特殊情况之一:

UIView *view;

就 ARC 而言,您可以将此指针设置为指向任何东西,只要任何东西具有与 、 和 相同的类型UIView签名。如果您指向与 的签名不同的类型签名的东西,则程序的行为是未定义的。retainreleaseautoreleaseviewretain-[UIView retain]

第二段

您可以将该view变量设置为指向任何东西,只要任何东西都适用于 Objective-C 消息发送系统(即objc_msgSend函数及其变体),并且只要任何东西在接收到retain, release,时具有所描述的语义和autorelease消息。

特别是,这意味着你可以将它指向不是 Objective-C 类实例的东西,如果你小心地让这些东西的内存布局符合objc_msgSend预期,并且只要你让这些东西正确响应retain, release, 和autorelease. Apple 使用 Core Foundation 类型来做到这一点(尽管它没有完全记录在案)。

于 2012-12-12T08:21:49.297 回答
1

全文如下:

可保留对象指针是空指针或指向有效对象的指针。此外,如果它具有块指针类型并且不为空,那么它实际上必须是指向块对象的指针,并且如果它具有类类型(可能是协议限定的),那么它实际上必须是指向类对象的指针。否则,只要实现方法遵循静态类型的签名,ARC 就不会强制执行 Objective-C 类型系统。如果 ARC 暴露于无效指针,则这是未定义的行为。

英语语法有点复杂,但它表示如果指针未声明为类,则 ARC 不会对其执行任何操作。

于 2012-12-12T06:53:11.823 回答