我正在编写一个仅使用@properties 的应用程序。我的任何类文件中都没有声明任何 ivar。据我了解,随着@property的引入,不再需要ivars。我是否按照最佳实践进行编码?从长远来看,这最终会咬我的屁股吗?我一直在阅读关于什么是“正确”和“错误”的褒贬不一的评论......

有帮助吗?

解决方案

我一般也不声明 ivars。 我会经常使用 @synthesize foo = foo_; 尽管当我指的是通过方法时防止直接访问,反之亦然。 我总是让编译器自动将 ivar 与 _ 前缀(可防止意外直接访问,根据 击中 短语)。

而且,正如 Caleb 所说,仍然有 ivars 浮动,你只是不显式声明它们,除非你真的想要(实际上,你不会这样做,因为标头中暴露的 ivars 对类的客户端没有用处) ,如果您的 API 设计得当)。

我还发现,关于“仅在 init/dealloc 中使用直接访问,在其他地方使用 setter/getter”的宣传在很大程度上被夸大了,因此,只需在任何地方使用 setter/getter 即可。现实情况是,如果你在初始化/释放期间有观察者,那么你已经被淹没了;根据定义,对象的状态在构造/销毁期间是未定义的,因此观察者不可能正确地推理该状态。


正如 Caleb 指出的,在 init/dealloc 中使用直接 ivar 访问的另一个原因是避免子类实现自定义 setter/getter 逻辑,这些逻辑可能会由于 init/dealloc 期间对象的未定义状态而导致失败。

虽然这可能是真的,但我认为用自定义行为实现 setter/getter 是一个令人讨厌的架构缺陷。这样做很脆弱,并且随着时间的推移,重构代码会变得更加困难。同样,这种自定义行为通常会依赖于对象内的其他状态,并且该依赖关系会导致对状态更改的顺序依赖,而这些状态更改根本无法通过看似简单的方式反映出来。 @property 宣言。

IE。如果你的 setter 和 getter 是这样写的 foo.bar = bad; 不能执行于 任何 时间 foo, ,那么你的代码就被破坏了。

其他提示

它不是如此不需要实例变量。它只是实例变量声明。鉴于属性和@Synthesize语句,编译器将注意与适当的访问者方法一起创建实例变量。

专门使用属性没有任何问题。它们简化了内存管理。如果这就是你想要的话,使用IVAR也没有任何问题,如果这就是你想要的话。如果要使用属性但不希望将访问者通告给世界其他地区(即维护封装),请考虑在类扩展中声明非公共属性(基本上是实现文件中的匿名类别)。

使用ivars肯定没有错误,但现在最好的做法现在可以推动使用@property。

您可能想要使用ivar的一个地方是当您想要声明受保护的属性时。您在第.m文件中声明了类的属性,并在与@protected指令中声明.h中的相应IVAR。然后,这将允许您在子类中有受保护的访问权限。没有替代方案的受保护访问权限。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top