使用手动内存管理时,我们可以编写对未在类中声明的方法的调用.在这种情况下,我们在编译期间获得的仅是警告.这就是维基百科在最具特色的Objective-C功能之一上所说的:
面向对象编程的Objective-C模型基于传递给对象实例的消息.在Objective-C中,不仅仅是调用方法; 一个人发一条消息.这与C++使用的Simula风格的编程模型不同.这两个概念之间的区别在于如何执行方法或消息名称引用的代码.在Simula风格的语言中,方法名称在大多数情况下由编译器绑定到目标类中的一段代码.在Smalltalk和Objective-C中,消息的目标在运行时被解析,接收对象本身解释消息
那么为什么ARC中的编译错误呢?打破语言强大功能的原因是什么?我不知道什么是如此重要?任何人都能解释一下吗?谢谢
在这个讨论中有一些关于它的信息:
http://lists.apple.com/archives/objc-language/2012/Jul/msg00110.html
在ARC下,编译器现在需要该方法返回的所有权类型.在这种情况下,默认情况下该对象不归调用者所有,但在实际声明中,该对象可能由调用者拥有("ns_returns_retained"属性),相反,您可能拥有像newBar这样的拥有方法,返回非-retained对象("ns_returns_not_retained"属性),在前一种情况下,你得到一个欠释放,你得到一个过度释放,这对ARC是不利的.
为了使ARC具有确定性,编译器必须承担很多事情,以便在ARC之前使某些行为变得非法,以确保行为是一致的.
这种反应似乎来自苹果公司的一位开发人员:
http://lists.apple.com/archives/objc-language/2012/Jul/msg00114.html
我们的推理在大约50/50之间分开(1)需要更加注意类型和所有权;(2)想要消除语言中令人尴尬的疣(不允许抱怨完全未知的方法,而不是任何比警告).实际上没有合理的理由来调用甚至没有在某处声明的方法.执行此操作的能力会导致一些非常微不足道的错误(例如选择器中的拼写错误)运行时故障而不是编译失败.我们一直都在警告它.修复你的代码.
所以主要的论点是编译器需要知道返回值的所有权.