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

 milksoul 发布于 2023-02-10 14:29

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

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

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

1 个回答
  • 在这个讨论中有一些关于它的信息:

    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)想要消除语言中令人尴尬的疣(不允许抱怨完全未知的方法,而不是任何比警告).实际上没有合理的理由来调用甚至没有在某处声明的方法.执行此操作的能力会导致一些非常微不足道的错误(例如选择器中的拼写错误)运行时故障而不是编译失败.我们一直都在警告它.修复你的代码.

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

    2023-02-10 14:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有