使用手动内存管理时,我们可以编写对类中未声明的方法的调用。在这种情况下,我们在编译期间获得的仅是警告。这就是维基百科在最具特色的Objective-C特征之一上的陈述:
面向对象编程的Objective-C模型基于传递给对象实例的消息。在Objective-C中,不仅仅是调用方法;一个人发一条消息。这与C ++使用的Simula风格的编程模型不同。这两个概念之间的区别在于如何执行方法或消息名称引用的代码。在Simula风格的语言中,方法名称在大多数情况下由编译器绑定到目标类中的一段代码。在Smalltalk和Objective-C中,消息的目标在运行时被解析,接收对象本身解释消息
那么为什么ARC中的编译错误呢?打破语言强大功能的原因是什么?我不知道什么是如此重要?任何人都能解释一下吗?感谢
答案 0 :(得分:5)
在此讨论中有一些相关信息:
在ARC下,编译器现在需要完全属于所有权类型 方法返回。在这种情况下,默认值是对象不是 由调用者拥有,但在实际声明中该对象可能是 由调用者拥有(“ns_returns_retained”属性),相反,你 可能有一个像newBar这样的拥有方法,它返回一个非保留的方法 object(“ns_returns_not_retained”属性),在前一种情况下你 在后者得到一个不足释放你得到一个过度释放,这是 对ARC不利。
为了使ARC具有确定性,编译器必须承担很多事情 所以某些以前没事的行为在ARC中被认定为非法 确保行为一致。
这个回应似乎来自苹果开发者之一:
我们的推理在(1)需要更多之间分成约50/50 关注类型和所有权以及(2)想要消除一个 语言中令人尴尬的疣(不允许抱怨) 完全未知的方法,比任何更加费力的方法 警告)。实际上没有合理的理由来调用方法 甚至没有在某处宣布。这样做的能力有所改善 非常琐碎的错误(例如选择器中的拼写错误)运行时故障 编译失败。我们一直都在警告它。修复你的代码。
所以主要的论点是编译器需要知道所有权 返回值。
答案 1 :(得分:2)
ARC管理保留/释放呼叫。要做到这一点,它需要知道你使用的所有方法的行为。
它需要您使用的邮件签名。它从头文件中获取它们。因此,它会强制您为所有使用的方法设置标题/声明。
没有标题就可以工作:你可以通过使用NSSelectorFromString来欺骗它,但这不是很安全,并且arc希望在默认情况下确保所有内容。