在Foundation,UIKit和其他框架标题中有多个@private
实例变量的示例。以下是一些例子:
//CLLocationManager.h
@interface CLLocationManager : NSObject
{
@private
id _internal;
}
<...>
//NSAutoreleasePool.h
@interface NSAutoreleasePool : NSObject {
@private
void *_token;
void *_reserved3;
void *_reserved2;
void *_reserved;
}
<...>
等
这些实例变量是@private
,因此除了类本身之外,无法从任何地方访问它们。将它们暴露在标题中有什么意义?
为什么不呢
//CLLocationManager.m
@interface CLLocationManager<>
{
id _internal;
}
甚至,考虑到现代的Objective-C语法:
//CLLocationManager.m
@interface CLLocationManager<>
@property(nonatomic, assign) id internal;
为什么apple在头文件中使用了私有实例变量,暴露了类的内部而不是将它们隐藏在实现中?
答案 0 :(得分:2)
Apple多年来所做的更改是API(应用程序接口),但是从结构和类中删除成员会更改ABI(应用程序二进制接口),如果不强制重新编译现有的所有程序,或者它们不能完成会崩溃。
void *_reserved
成员实际上很可能是已从API中删除的旧的已弃用符号,但是从类定义中删除它们会改变ABI,因此它们占用的空间一直是用void *
填充。
答案 1 :(得分:0)
在古代,当实例变量 在标题中声明时,许多标题都已创建。并且你不想改变工作代码,除非有充分的理由这样做 - 毕竟,一切正常,你只是好奇。
Apple不能只更新头文件;他们还必须更新实现,这意味着巨大的测试量(或者您认为可以在几十个文件中进行更改而不会出现任何错误?)