【问题标题】:What is the intention?目的是什么?
【发布时间】:2012-12-06 11:36:31
【问题描述】:

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

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

对于 ARC 而言,有效的对象是具有“良好行为”的对象 保留操作。具体来说,对象必须这样布置 Objective-C 消息发送机器可以成功发送它 以下消息:

  • 保留,不带参数并返回指向对象的指针。
  • 发布,不接受任何参数并返回 void。
  • 自动释放,不带参数并返回指向对象的指针。

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

我们可以推断出以下内容吗?

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

它是在谈论retain、release、autorelease方法的签名吗?如果有,是否有否定意义;

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

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    第一段

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

    void (^blockPointerTypeVariable)(int);
    

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

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

    Class someClass;
    

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

    Class<SomeProtocol> someClassWithProtocol;
    

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

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

    UIView *view;
    

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

    第二段

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

    特别是,这意味着你可以将它指向不是 Objective-C 类实例的东西,如果你小心地使这些东西的内存布局符合 objc_msgSend 的预期,并且只要你使这些事情正确响应retainreleaseautorelease。 Apple 使用 Core Foundation 类型执行此操作(尽管没有完全记录)。

    【讨论】:

      【解决方案2】:

      全文为:

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

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

      【讨论】:

        猜你喜欢
        • 2015-03-21
        • 2011-03-05
        • 2019-07-14
        • 1970-01-01
        • 2018-11-04
        • 2015-01-17
        • 2021-11-05
        • 2011-09-26
        • 2011-08-20
        相关资源
        最近更新 更多