在Objective-C中不使用属性的情况



在apple OS X 10.8核心库文档中,用Objective-C编程,它说,

"在任何需要的时候使用对象的属性是最佳实践跟踪一个值或另一个对象。如果你需要定义您可以添加自己的实例变量,而无需声明属性它们在类接口或的顶部的大括号内实现……"

所以我很好奇,那么,什么情况下你需要定义实例变量而不声明属性?抛开苹果的说法不谈,这真的只是个人偏好的问题吗?

谢谢!

其中一些绝对是偏好问题,但不是所有问题:您最好为具有外部可见性的项以及需要在类内外不同访问控制的项设置属性。自从引入ARC以来,这个问题已经不那么明显了,因为在它之前,您可能希望使用属性来自动调用retain和release。当您需要自动将对象复制到您的属性中时,属性这方面的重要性已经大大降低。

如果你正在使用ARC和最近的运行时(最近的足以让你在@implementation块中声明你的ivars),那么实例变量突然又很棒了。为什么?因为与@properties不同,它们是特定于类的。没有意外被子类重写的风险。

在简单的情况下,它们也更快,因为你不需要调用任何方法来获取或设置它们。

我个人也觉得它更干净。不再有定义私有@properties的类扩展,以及所有那些垃圾。只是变量,很好很简单。

所以最好的建议,恕我直言,是默认使用它们。只有当你真正需要它们的功能时才使用@properties,例如:
  • 你需要一种从类外访问它们的方法。
  • 你想让子类覆盖它们。
  • 你的getter或setter不仅仅是一个简单的赋值。

后两者实际上都比你想象的要少。试图在子类中重写属性通常是不明智的,因为这有点不寻常,而且有一些粗糙的边缘。

如果您后来发现需要将ivar升级为@属性,这很好也很容易—它唯一可以访问的地方是在您的@实现中,因此通常只需简单的搜索和替换即可向其引用添加"self."(如果您这样命名它们,可能会删除前导下划线)。在此之前,您不需要支付使用@properties的成本和风险。

我更喜欢属性,因为我可以定义setter/getter,因为我更喜欢那种语法。
许多人肯定使用变量是一种不好的做法,就像本文中所示:
http://cocoasamurai.blogspot.it/2012/08/cover-up-those-ivars.html
不幸的是,现在的程序员把他们不喜欢的都称为坏实践,甚至没有客观原因。
如果你声明了一个ivar,你仍然可以使用@private指令,所以这不是暴露或不暴露变量的问题。我认为如果你喜欢更多的变量,你应该使用它们

相关内容

  • 没有找到相关文章

最新更新