这只是一个封装问题,您可以拥有许多不同级别的隐私......
最初在 Objective-C 中,运行时不支持在运行时向对象添加实际字段,因此必须在类中列出每个 iVar:
@interface MyClass : NSObject
{
//every ivar that MyClass adds to NSObject must be here
}
这是一个简单且足够好的系统一段时间......
甚至必须声明私有 iVar,尽管编译器不会让您在错误的范围内访问它们。
@interface MyClass : NSObject
{
@private
id someObj;
}
此可见性说明符限制访问,例如:
//someotherclass.m
+ (void)doSomething
{
MyCLass * mc = [MyClass new];
mc->someObj = [SomeOtherClass new]; // error cant access private variable...
}
但是你可能会通过指针算术得到它,所以为了混淆你会在类中看到这样的东西:
@interface MyClass : NSObject
{
@private
void * __reserved1;
void * __private1;
}
这是一个很好的混淆......
但是等等......必须有更好的方法!
进入非易碎 ABI
现在类只需要导出它们的超类和公共接口。
@interface MyClass : NSObject
@property (readonly,retain) id someIVar;
其余的类内容可以包含在类扩展中:
@interface MyClass ()
{
id someObj;
}
@property (readwrite,retain) id someIVar;
请注意,这仅适用于 iPhone 和 64 位 OS X 32 位 OS X 仍然是旧的 ABI,需要在那里工作的库需要采用旧的方式。