意图是什么?

时间:2012-12-06 11:36:31

标签: objective-c automatic-ref-counting

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

  

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

     

出于ARC的目的,一个有效的对象就是“表现良好”的对象   保留业务。具体而言,必须对象进行布局   Objective-C消息发送机器可以成功发送它   以下消息:

     
      
  • 保留,不带参数并返回指向对象的指针。
  •   
  • 发布,不带任何参数并返回void。
  •   
  • autorelease,不带参数并返回指向对象的指针。
  •   

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

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

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

是否在讨论保留,释放,自动释放方法的签名?如果是这样,它是否具有负面含义;

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

2 个答案:

答案 0 :(得分:1)

全文如下:

  

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

英语语法有点复杂,但它说如果指针没有被声明为Class,那么ARC不会对它做任何事情。

答案 1 :(得分:1)

第一段

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

void (^blockPointerTypeVariable)(int);

如果将blockPointerTypeVariable设置为指向块的内容,则程序的行为是未定义的。 (您可以将其设置为指向具有不同类型签名的块,而不违反ARC的要求。但您无法将其设置为指向UIView。)

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

Class someClass;

这是一个“可保留的对象指针”变量,其中“Class类型”是“协议限定的”:

Class<SomeProtocol> someClassWithProtocol;

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

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

UIView *view;

就ARC而言,您可以将此指针设置为指向任何,只要任何内容​​与UIViewretain具有相同类型的签名即可,releaseautorelease。如果您将view指向retain的类型签名与-[UIView retain]的签名不同的内容,则表明您的程序行为未定义。

第二段

您可以将view变量设置为指向任何内容,只要任何内容​​适用于Objective-C消息发送系统(意味着objc_msgSend函数及其变体),并且因为任何东西在收到retainreleaseautorelease消息时都有所描述的语义。

特别是,这意味着你可以将它指向不是Objective-C类实例的东西,如果你小心地使这些东西的内存布局与objc_msgSend期望的内容匹配,并且当您对retainreleaseautorelease做出正确回应时。 Apple使用Core Foundation类型进行此操作(虽然它没有完全记录)。