@private是如何实现的?

Jon*_*ing 4 code-generation private language-implementation objective-c

在Objective-C,我很好奇如何实例变量,如访问控制@private,@protected等来实现.

我曾经考虑过以某种方式生成单独的结构:

@interface Foo {
  int bar;
  @private
  int baz;
  @public
  int qux;
}
Run Code Online (Sandbox Code Playgroud)

=> 一些东西

struct Class_Foo_Protected {
  int bar;
};

struct Class_Foo_Private {
  int baz;
};

struct Class_Foo_Public {
  int qux;
};
Run Code Online (Sandbox Code Playgroud)

但我真的不知道.谁知道这是怎么做到的?

Sve*_*ven 7

这些修饰符不会改变类的内存布局.编译器本身会记住哪个ivar是公共的,受保护的或私有的,并且如果您尝试从不适当的地方访问它们,则会发出错误.这是在生成任何代码之前完成的,并且不会影响生成的代码.

  • 为了澄清,你可以自由地使用运行时方法来访问任何类的任何ivar,没有什么能阻止你(除了这样做的一般回旋性质).`@private`纯粹是编译器的元数据,仅此而已. (5认同)