为什么Cocoa头中有私有实例变量?

时间:2014-06-25 10:38:09

标签: objective-c cocoa

在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在头文件中使用了私有实例变量,暴露了类的内部而不是将它们隐藏在实现中?

2 个答案:

答案 0 :(得分:2)

Apple多年来所做的更改是API(应用程序接口),但是从结构和类中删除成员会更改ABI(应用程序二进制接口),如果不强制重新编译现有的所有程序,或者它们不能完成会崩溃。

void *_reserved成员实际上很可能是已从API中删除的旧的已弃用符号,但是从类定义中删除它们会改变ABI,因此它们占用的空间一直是用void *填充。

答案 1 :(得分:0)

在古代,当实例变量 在标题中声明时,许多标题都已创建。并且你不想改变工作代码,除非有充分的理由这样做 - 毕竟,一切正常,你只是好奇。

Apple不能只更新头文件;他们还必须更新实现,这意味着巨大的测试量(或者您认为可以在几十个文件中进行更改而不会出现任何错误?)