为什么Objective-C上的指针在ivar上不好?

Sun*_*ise 2 properties objective-c ivar

我正在阅读"Effective Objective-C 2.0:52改进iOS和OS X程序的具体方法".在"第6项"中,作者说在公共ivar上使用指针是一个坏主意,因为编译后的代码将具有硬编码指针偏移量,并且当新的ivar将被添加到类中时,之前使用的指向某些ivars的指针现在可以指向其他变量.

@interface Foo
{
    @public
    NSString * string;
    NSArray * arr;
}
@end

@implementation
...
@end

int main()
{
  @autoreleasepool
  {
   Foo *f=[Foo new];
   f->string; //Is it bad idea?
  }

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是,ivars和属性是不是动态的(在编译时不知道偏移量)?正如Cocoa With Love所说:

"所有ivars在现代运行时都是动态的:由于所有ivars遵循此过程,这意味着现代Objective-C运行时中的所有ivars都是动态的,因为它们的绝对偏移在编译时永远不会被知道."

如果这是真的,那么为什么在伊塔尔上使用指针不好呢?请提供尽可能多的低级细节.

bbu*_*bum 7

如果这是真的,那么为什么在伊塔尔上使用指针不好呢?请提供尽可能多的低级细节.

因为它破坏了封装.

如果类Foo有一些应该在string更改时触发的自定义逻辑怎么办?或者它必须进行计算?或者Foo想要存储string独特的?或者其他什么想要观察所述房产的变化?或者Foo想稍后更改存储语义?或者有人想要子类化Foo并改变那里的行为?