我应该在Objective-C中使用ivars吗?

我有一个应用程序,我正在写,只使用@properties。 在我的任何课堂文件中,我都没有宣布任何一个伊娃。 据我所知,@属性不再需要ivars。 我是否按照最佳做法进行编码? 这最终会在长期的谚语中令我难堪吗? 我一直在阅读关于“正确”和“错误”的混合评论。

我通常也不宣布伊娃。 我会经常使用@synthesize foo = foo_; 尽pipe是为了防止直接访问,当我的意思是通过方法,反之亦然。 我总是让编译器自动合成带有_前缀的ivar(这可以防止意外的直接访问,按照被敲击的语句)。

而且,正如Caleb所说,还有一些ivars在浮动,你只是没有明确地声明他们,除非你真的想要这样做(实际上,你不像头文件中暴露的ivars对这个类的客户没有用处,如果你的APIdevise得当)。

我还发现,在“init / dealloc中只使用直接访问,在其他地方使用setter / getter”的炒作大部分被夸大了,因此,只是在任何地方使用setter / getter。 现实情况是,如果你在初始化/释放期间有观察者,那么你已经被清理了。 根据定义,对象的状态在构造/销毁期间是不确定的,因此观察者不可能正确地推理状态。


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

虽然这可能是真的,但我认为这是一个令人讨厌的架构缺陷来实现定制行为的setter / getters。 这样做是脆弱的,并且随着时间的推移重构代码将变得更加困难。 而且,这样的自定义行为通常会依赖于对象内的其他状态,并且依赖关系会导致状态更改的顺序依赖关系,而这些依赖关系完全不是由看似简单的@property声明所反映的。

也就是说,如果你的foo.bar = bad;者和获得者被写成foo.bar = bad; 不能在任何时候执行foo ,那么你的代码被破坏了。

没有那么多的实例variables是不需要的。 只是不需要实例variables声明 。 给定一个属性和一个@synthesize语句,编译器将负责创build实例variables以及适当的访问器方法。

仅使用属性没有任何问题。 它们简化了内存pipe理。 如果没有属性,使用iVars也没有问题,如果这是你想要的。 如果你想使用属性,但不想公布访问者到世界其他地方(即维护封装),可以考虑在类扩展中声明你的非公共属性(在你的实现文件中基本上是一个匿名类)。

使用iVars肯定没有错,但现在最好的做法是推动使用@property。

一个地方你可能想要使用伊娃,当你想要声明一个受保护的财产。 您在.m文件中为类声明属性,并使用@protected指令在.h中声明其相应的ivar。 这会让你在子类中有一个受保护的访问。 没有其他select来保护成员的访问权限。