nop*_*ole 5 interface objective-c
据说,接口是谈论抽象 - 类的接口 - 可用的方法,它们采用什么参数,以及返回值是什么 - 所以在@interface部分中定义的实例变量可以有点混乱?
那些实例变量可以是任何东西,它们是内部实现细节 - 程序员可以class A使用10个实例变量定义,而另一个程序员可以重写整个类,具有相同的接口(API),并且只使用6个实例变量,所以实例变量实际上与该@interface部分无关,不是吗?
如果实例变量列在单独的部分(例如@states部分)中以表明它们是对象的内部状态,那会更有意义吗?
最初,Objective-C类只不过是结构中的结构.也就是说你有一个NSObject的子类和该子类的子类.编译器将有效地连接ivars以创建可以封装整个实例的ivars的结构.
即
{{{
// @interface NSObject
Class isa;
}
// @interface Subclass : NSObject
int ivar1;
int ivar2;
}
// SubSubclass : Subclass
int ivar3;
}
Run Code Online (Sandbox Code Playgroud)
因此,必须暴露ivars,以便编译器可以计算子类中各种ivars的正确偏移量,并且,正如您所观察到的,实现细节应该成为Class的公共API的一部分.
即这是"脆弱的基类"问题.如果不重新编译已知和未知的所有子类,您就无法更改超类中的ivars,否则您将面临崩溃的风险.
这一点都在"现代ABI"中得到了解决,它与Objective-C 2.0一起或多或少(由于二进制兼容性依赖性,它并不在所有平台上).
通过修复"脆弱的基类"问题,它还使编译器能够接受@interface之外的ivar声明,包括在@implementation中,作为类扩展的一部分或隐含的声明@synthesize.
最终结果是你的ivars可以完全是私有的,你可以随心所欲地改变它们而不需要重新编译子类.
你也可以在实现文件中定义实例变量,试试吧。
此外,如果您不想显示实际的实例变量,而只想显示属性访问器,则可以在接口和实现中(而不是实例字段)定义 @property,使用@synthesize myProperty = _myField;. 一切都在那里。