gpt4 book ai didi

objective-c - 在 Objective-C 中,@interface 部分列出了实例变量……是不是有些放错地方了?

转载 作者:太空狗 更新时间:2023-10-30 03:51:29 25 4
gpt4 key购买 nike

按理说,接口(interface)就是讲Abstraction——一个类的Interface——有什么方法可用,有什么参数,返回值是什么——所以定义的实例变量在@interface 部分可能有点困惑?

这些实例变量可以是任何东西,它们是内部实现细节——程序员可以使用 10 个实例定义 class A变量,另一个程序员可以重写整个类,具有相同的接口(interface) (API),并且只使用 6 个实例变量,所以实例变量真的​​与 @interface 部分无关,不是吗?

如果将实例变量列在单独的部分(例如 @states 部分)以表明它们是对象的内部状态,是否会更有意义?

最佳答案

最初,Objective-C 类只不过是结构中的结构。 IE。假设你有一个 NSObject 的子类和那个子类的一个子类。编译器将有效地连接 ivars 以创建一个结构,该结构可以封装整个实例的 ivars。

{{{
// @interface NSObject
Class isa;
}
// @interface Subclass : NSObject
int ivar1;
int ivar2;
}
// SubSubclass : Subclass
int ivar3;
}

因此,必须公开 ivars,以便编译器可以为子类中的各种 ivars 计算正确的偏移量,并且正如您所观察到的,本应是实现细节的内容变成了类的公共(public) API 的一部分。

即这就是“脆弱的基类”问题。如果不重新编译所有已知和未知的子类,就不能更改父类(super class)中的 ivar,否则你将面临崩溃的风险。

这在 Objective-C 2.0 附带的“现代 ABI”中或多或少都得到了修复(由于二进制兼容性依赖性,它并非在所有平台上都有)。

通过修复“脆弱的基类”问题,它还解放了编译器来接受@interface 之外的ivar 声明,包括在@implementation 中,作为类扩展的一部分或@ 隐含的声明合成

最终结果是您的 ivar 可以完全私有(private),您可以随心所欲地更改它们而无需重新编译子类。

关于objective-c - 在 Objective-C 中,@interface 部分列出了实例变量……是不是有些放错地方了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com