为什么 Objective-C 实例变量要在接口中声明?

2024-01-26

我刚刚开始接触 Objective-C(Java 是我的主要面向对象语言)。

在接口而不是类中定义对象的实例变量似乎很奇怪。我习惯了接口作为公共 API 定义,除了方法签名之外什么都没有(这里不包括常量)。

是否有某种原因导致状态在接口中定义(即使它是私有的)而行为在类中定义。这似乎很奇怪,因为对象是状态+行为,所以定义将被分成两个单独的地方。

这是某种设计上的好处吗?您在 Objective-C 中被迫处理的后问题?不是问题,只是不同?为什么这样做有任何背景吗?

或者你可以将对象状态放入一个类中,而我在我的书中还没有触及这一部分吗?


UPDATE

下面的答案是在实现中声明实例变量的语言功能实现之前编写的。现在问题的前提不再有效。作为火蜥蜴 https://stackoverflow.com/users/762175/firelizzard说,没有什么需要进入@interface你不想公开。


这是由于 Objective-C 最初是建立在 C 之上的一个相当薄的层这一事实的一个遗留问题。C 的方法是定义模块的接口(不要与 Java 的接口混淆)interface)在头文件中并逐字地将其包含在每个编译单元中。这类似于自动将声明复制粘贴到每个编译文件的顶部。如果这看起来很原始,那是因为它确实很原始,但 C 是一门有 40 年历史的语言。

您必须在接口中定义实例变量(甚至是私有变量),因为 Objective-C 对象被实现为 C 结构体,它们本身只是内存块和该块内的命名偏移量。表示每个类的对象的结构必须包含用于超类实例变量的空间,因此子类至少需要知道表示超类的 C 结构体的大小以及公共和受保护的实例变量偏移量。不幸的是,这意味着所有实例变量,甚至私有变量都必须作为外部接口的一部分公开。* C++,C 的其他 OO 版本,由于同样的原因,也遇到了同样的问题。

必须两次写下所有方法签名有点痛苦,但你会习惯的。

*使用 64 位运行时,您不再需要在@interface但由于所有方法都是公共的,它仍然意味着将内部状态暴露给外部世界,尽管它确实缓解了脆弱的基类 http://en.wikipedia.org/wiki/Fragile_base_class问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Objective-C 实例变量要在接口中声明? 的相关文章

  • 如何清除代码中的 NSLog 输出?

    有没有办法清除代码中的控制台输出 thanks 我喜欢的快捷方式 Simply USE K Keyboard Shortcut when you want to clear the NSLOG Data
  • 如何解决malloc_error_break?

    我在 iOS 3 0 模拟器上遇到此错误 但在 3 1 3 和 3 2 模拟器上没有遇到此错误 创建符号断点后malloc error break 我在日志中看到了这一点 Session started at 2010 02 13 19 1
  • 如何用图片替换UITableView?

    我有一个 UITableView 默认为空白 直到用户编辑并向其添加数据 我想显示一张带有说明的图像 直到用户编辑它为止 图片的大小非常适合导航栏和标签栏之间 有没有办法以编程方式执行此操作 您可以使用removeFromSuperview
  • 如何从 AFNetworking 和 AFJSONRequestOperation 获取可变字典?

    我将 JSONKit 与 AFNetworking 的 AFHTTPClient 带有 AFJSONRequestOperation 一起使用 我似乎无法弄清楚如何触发使用 JSONKit 的 mutableObjectFrom 方法 而不
  • ios 在后台处理推送通知

    我想保存应用程序处于后台状态时到达的推送通知 我知道关于 void application UIApplication application didReceiveRemoteNotification NSDictionary userIn
  • ios 导航 堆栈操作

    我在尝试从 iOS 应用程序操作导航堆栈时遇到问题 或者至少是由于这种操纵而产生的行为 我的情况 我有 3 个 ViewController 控制器a显示多个级别 控制器 b 是游戏视图 控制器 c 是某种分数 显然 我将在控制器 a 中选
  • 从命令行调试 iOS 应用程序构建

    我正在通过命令行构建 iOS 应用程序 但在调试它时遇到问题 如果我使用 XCode 进行构建 它会让我在设备上 构建和调试 而不会出现任何问题 但现在 我不知道如何使用 gdb 在设备上启动它并逐步执行它 如果我尝试 添加自定义目标 可执
  • UIDocumentInteractionController 阻止“打开方式”表中的空投

    在我的应用程序中 我允许用户通过 Instagram 分享照片 这需要使用 UIDocumentInteractionController 如果手机支持 则会自动检测空投 如何将其从 打开方式 操作表中删除 即使我使用 UIActivity
  • 确定 Objective-C 方法在运行时是否是可变的

    有没有办法在运行时找出给定方法是否是可变参数类型 就像是method getTypeEncoding 这不会告诉我一个方法是否接受可变数量的参数 或者有什么技巧可以告诉我们吗 罗伯特的评论是正确的 考虑 interface Boogity
  • 如何使 for 循环以与 NSLog(@"%@", arrData) 相同的顺序迭代

    我执行了以下代码NSLog arrData 调试器中的输出预计如下所示 0 first name John 1 first name Florence 2 first name Melinda 3 first name Zack 然后我执行
  • 我如何获取用户的电子邮件? iPhone SDK

    我需要获取 Mail app 中使用的用户的电子邮件地址 如何使用 iPhone SDK 做到这一点 谢谢你 简短的回答 你不能 如果需要 您应该提示用户输入电子邮件地址
  • 如何检查 BOOL 是否为空?

    有没有办法在将值分配给 BOOL 之前检查该值是否为 NULL Nil 例如 我在 NSDictionary 中有一个值可以是 TRUE FALSE NULL mySTUser current user following results
  • 如何在 ios 7 上更改重新排序控制图像

    我正在寻找一种更改重新排序控件图像和大小的方法 我使用此代码来更改重新排序图像 void tableView UITableView tableView willDisplayCell UITableViewCell cell forRow
  • 如何在 UICollectionView 的节标题中动态添加标签和按钮?

    请帮助我如何水平添加标签和水平添加类似的按钮 但每个按钮应像另一个部分一样在每个标签的下方对齐 这应该在 UICollectionView 的标题中动态发生 因为标签和按钮的数量根据我的数据 我想制作一种 Excel 类型的布局 并在标题中
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • NSURL URLWithString:引发异常

    简而言之 NSURL URLWithString 似乎引发了一个例外 根据文档 如果字符串格式错误 则返回 nil 没有提到在任何情况下都会引发异常 除此之外 我还对 URL 进行编码并检查nil在将字符串转换为 URL 之前 任何人都可以
  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • 避免“在此块中强烈捕获自身可能会导致保留周期”消息

    每次我必须在块内使用全局变量或属性时 如下所示 self save if isItSaving NO self saveMyFile 我必须像这样重写 BOOL iis isItSaving id myself self self save
  • 如何更改已上传的 Firebase 存储图像文件名?

    我需要更改已上传到 firebase 存储中的文件名 因为 在 firebase 存储中上传图像后 我将 url 保存在 firebase 数据库中的特定子 文件夹 下 但是 当我将图像移动到另一个子 文件夹 时 我需要根据新名称更改存储中
  • 当您感兴趣的任务完成时,是什么让完成处理程序执行该块?

    我一直在询问并试图了解完成处理程序是如何工作的 我用过很多 也读过很多教程 我将在这里发布我使用的代码 但我希望能够创建自己的代码 而无需使用其他人的代码作为参考 我理解这个完成处理程序 其中调用者方法 void viewDidLoad n

随机推荐

  • FatFree 路由在生产中不起作用

    我有一个具有许多路由路径的应用程序 如下所示 F3 route GET Main gt get front page F3 route GET login check for login Login gt check for login 第
  • Python 发行版有哪些用例?

    我正在为我正在编写的 Python 包开发一个发行版 以便我可以发布 它在 PyPI 上 这是我第一次使用 distutils setuptools distribute pip setup py 等等 我在学习曲线上有点挣扎 这比我预期的
  • 将 php 表单中的发件人电子邮件地址更改为收件人

    我正在尝试创建一个简单的 php 电子邮件表单 将提交的内容发送到指定的地址 但我试图解决的问题是电子邮件发送的地址 目前 它发送自 电子邮件受保护 cdn cgi l email protection 但我希望能够将其更改为简单的 电子邮
  • 为什么 GETDATE() 是无效标识符

    当我调试此代码时 为什么 Oracle Sql Developer 工具显示 GETDATE 是无效标识符 CREATE OR REPLACE TRIGGER SPName AFTER UPDATE ON TableName FOR EAC
  • Firebase querySnapshot 未根据 where 条件实时更新

    我使用带有 flutter 的 cloud firestore 来存储聊天内容 并使用 where 条件来获取聊天内容 文档正确返回 但添加新数据时聊天列表不会实时更新 聊天记录如何存储 collection gt message mess
  • 无法导入数据类模块

    今天我从 apt get 安装了 python 3 7 来尝试新的 dataclasses 模块 我单独安装了它 因为 python3 6 无法升级到 3 7 当我输入 python3 7 version 它给了我 gt gt gt Pyt
  • 代理和 fetchMore()/canFetchMore() 背后的 Qt 模型

    我很想知道当具有增量数据获取的主数据模型位于代理或代理链后面时 视图将如何表现 代理如何进行项目重新排列 例如取消分组代理 示例 http lynxline com jongling qt models http lynxline com
  • 如何在修改后更新 Android 视图?

    我的视图中有一些方法可以修改调用时绘制的一些形状 在 Java 中 为了确保组件已更新 我会调用repaint 有什么可以确保我的视图正确更新吗 我曾在某处读到过这样的呼唤invalidate in the onDraw 方法将使事情保持最
  • HTTP_INTERCEPTORS 仅在 AppModule 中

    我正在尝试在我的 Angular 6 应用程序中实现延迟加载 我所有的 http 调用都是在FeatureModule 延迟加载 但我仍然必须添加HttpClientModule in my AppModule并且不在FeatureModu
  • Node.js 中的 HTTP.request 不断收到错误请求

    我刚刚安装了 Node js 也许我遗漏了一些东西 但我正在尝试一个简单的 http request 但除了 400 个响应之外什么也没有得到 我已经尝试了几个主机但没有运气 我从他们的网站安装了 Node 这不起作用 所以我卸载并通过 H
  • EPPlus:在单元格中定位图像

    我正在尝试使用 Epplus 将图像 插入 Excel 中的单元格 使用以下代码 private static void SetImage ExcelWorksheet sheet ExcelRange cell using WebClie
  • 这个正则表达式是什么意思 - “\p{Lu}”?

    我在 C 中偶然发现了这个正则表达式 我想移植到 javascript 但我不明白以下内容 p Lu p Ll 0 9 当然 我遇到困难的部分是 p Lu 我访问过的所有正则表达式网站都没有提到这个修饰符 任何想法 这些都被考虑Unicod
  • Ruby on Rails - 验证成本

    验证用户输入的成本 价格的最佳方法是什么 验证规则如下 允许的格式示例 23 2 1 23 0 25 5 6 3 小数点后最多两位数 最小值 0 01 最大值 9 99 检查价格并验证格式 rails 3 validates price f
  • MySQL 将 secure-file-priv 设置为多个目录

    有没有办法让MySQL从多个目录加载数据而不需要设置secure file priv 例如 类似 secure file priv path to dir1 path to dir2 从阅读docs https dev mysql com
  • 如何在gridview适配器中回收位图?

    我的 android 应用程序中有一个网格视图 我正在从服务器将图像加载到网格视图 我正在使用延迟加载 我必须回收此处创建的所有位图 如何在适配器或网格视图中执行 Bitmap recycle 我失忆了 请帮助我 您将需要显示一些代码 至少
  • 从 EC2 实例内查找区域

    有没有办法从实例内部查找实例的区域 我正在寻找类似于方法的东西查找实例 ID https stackoverflow com questions 625644 find out the instance id from within an
  • Bash 参数扩展分隔符

    我想得到1 2 3 4 5 6 7 8 9 10使用参数扩展 1 10 和模式匹配 var echo 1 10 echo var 1 2 3 4 5 6 7 8 9 10 有没有一种更优雅的方式 单行 来做到这一点 优雅在于情人眼中 set
  • 是否有针对各种操作系统(和版本)的预处理器定义列表?

    例如的映射 Mac OS 10 6 3 又名 Snow Leopard gt APPLE LP64 Windows 7 Windows XP gt WIN32 Linux gt LINUX 干得好 http predef sourcefor
  • 重新排序 .strings 文件

    In my Localizable Strings我尝试按字母顺序排列所有对 是否可以按字母顺序重新排序我的Localizable strings文件不区分大小写 也许使用 genstring 或特殊的 bash 脚本 例如我有字符串 ap
  • 为什么 Objective-C 实例变量要在接口中声明?

    我刚刚开始接触 Objective C Java 是我的主要面向对象语言 在接口而不是类中定义对象的实例变量似乎很奇怪 我习惯了接口作为公共 API 定义 除了方法签名之外什么都没有 这里不包括常量 是否有某种原因导致状态在接口中定义 即使