我注意到很多Apple的接口在其实例变量声明之前使用@private
。这是否有一个好的设计理由,是我应该做的吗?标记实例变量@private
2
A
回答
4
私有实例变量用于将接口与实现分离。在Objective-C中,因为类声明必须显示所有实例变量,所以需要一种方法来阻止子类访问属于内部实现的子类。否则,其他程序员可以编写依赖于这些内部变量的代码,这将使得类设计人员无法在不破坏现有代码的情况下对类内部进行更改。
看着它的另一种方法,实例变量是不标记为私人与子类的程序员合同的一部分,而标记为私有的哪些不是。
这意味着实例变量通常应该标记为private,以便只有通过它们的访问器方法才能访问它们(如果有的话)。否则,有人可以轻松地编写你的类的子类,并简单地创建一个访问器来公开任何实例变量。
1
如果您不希望子类能够访问变量,请将它们标记为@private。
0
这样做的另一种方法是在@implementation部分中声明实例变量。这些变量隐含地是私有的。来源:Kochan:编程Objective-C,第四版。页。 199.因此,正如e.James所述,类声明必须显示所有实例变量,这是不正确的。
在@interface中声明实例变量的唯一原因是允许它们被派生类(子类)继承。
+0
正确的做法是将其在.m文件的类扩展中声明。这适用于私人方法以及ivars和属性。类扩展看起来像一个未命名的类别'()',但具有不同的语义和功能。 – ikuramedia 2012-02-17 10:52:19
相关问题
- 1. 私有@property是否创建@private实例变量?
- 2. 实例变量
- 3. 实例变量
- 4. 实例变量
- 5. 红宝石标记实例变量作为不可分配
- 6. 将在“init”中定义的servlet实例变量标记为“volatile”
- 7. 定义为Private的变量
- 8. 实例变量找不到标识
- 9. 目标C类别的实例变量
- 10. iOS实例变量
- 11. querydsl实例变量
- 12. 常量实例变量?
- 13. 什么情况下,实例变量在'use fields'中声明为'_var'为private?
- 14. 如何使用Objective-C中的类别访问@private实例变量?
- 15. 在目标中全局变量实例变量c
- 16. 实例化实例变量为块
- 17. 实例变量,受另一个实例
- 18. Ruby中的类实例变量和实例变量
- 19. AWS实例宝途标记
- 20. Ruby中的类变量实例变量
- 21. Rails - 局部变量与实例变量
- 22. 运作volatile变量VS实例变量
- 23. python类实例变量和类变量
- 24. 分配实例变量静态变量
- 25. Ruby实例变量和局部变量
- 26. 模糊与实例变量
- 27. 实例vs局部变量
- 28. Ruby实例变量访问
- 29. 使用实例变量
- 30. Ajax TimerControl和实例变量?
感谢您的详细解答。至于编写一个子类来公布实例变量,我很肯定'@ private'不能防止类别公布它们。思考? – 2009-12-19 17:47:15
我试过了,你绝对正确。看起来类别可以访问所有实例变量,包括私有变量。我认为Objective-C仍然给你足够的绳索,如果你真的想要:) – 2009-12-19 18:05:10
你还可以使用运行时功能来抓住伊娃。但是,如果你正在做这样的事情,你知道这是一个肮脏的黑客,不像天真地依靠一个你认为是可靠的超级IVAR。 – Chuck 2009-12-19 19:26:13