为什么ARC禁止调用未声明的方法?

时间:2013-12-14 11:22:18

标签: objective-c automatic-ref-counting

使用手动内存管理时,我们可以编写对类中未声明的方法的调用。在这种情况下,我们在编译期间获得的仅是警告。这就是维基百科在最具特色的Objective-C特征之一上的陈述:

  

面向对象编程的Objective-C模型基于传递给对象实例的消息。在Objective-C中,不仅仅是调用方法;一个人发一条消息。这与C ++使用的Simula风格的编程模型不同。这两个概念之间的区别在于如何执行方法或消息名称引用的代码。在Simula风格的语言中,方法名称在大多数情况下由编译器绑定到目标类中的一段代码。在Smalltalk和Objective-C中,消息的目标在运行时被解析,接收对象本身解释消息

那么为什么ARC中的编译错误呢?打破语言强大功能的原因是什么?我不知道什么是如此重要?任何人都能解释一下吗?感谢

2 个答案:

答案 0 :(得分:5)

在此讨论中有一些相关信息:

  

在ARC下,编译器现在需要完全属于所有权类型   方法返回。在这种情况下,默认值是对象不是   由调用者拥有,但在实际声明中该对象可能是   由调用者拥有(“ns_returns_retained”属性),相反,你   可能有一个像newBar这样的拥有方法,它返回一个非保留的方法   object(“ns_returns_not_retained”属性),在前一种情况下你   在后者得到一个不足释放你得到一个过度释放,这是   对ARC不利。

     

为了使ARC具有确定性,编译器必须承担很多事情   所以某些以前没事的行为在ARC中被认定为非法   确保行为一致。

这个回应似乎来自苹果开发者之一:

  

我们的推理在(1)需要更多之间分成约50/50   关注类型和所有权以及(2)想要消除一个   语言中令人尴尬的疣(不允许抱怨)   完全未知的方法,比任何更加费力的方法   警告)。实际上没有合理的理由来调用方法   甚至没有在某处宣布。这样做的能力有所改善   非常琐碎的错误(例如选择器中的拼写错误)运行时故障   编译失败。我们一直都在警告它。修复你的代码。

所以主要的论点是编译器需要知道所有权 返回值

答案 1 :(得分:2)

ARC管理保留/释放呼叫。要做到这一点,它需要知道你使用的所有方法的行为。

它需要您使用的邮件签名。它从头文件中获取它们。因此,它会强制您为所有使用的方法设置标题/声明。

没有标题就可以工作:你可以通过使用NSSelectorFromString来欺骗它,但这不是很安全,并且arc希望在默认情况下确保所有内容。