2009-12-19 66 views

回答

4

私有实例变量用于将接口与实现分离。在Objective-C中,因为类声明必须显示所有实例变量,所以需要一种方法来阻止子类访问属于内部实现的子类。否则,其他程序员可以编写依赖于这些内部变量的代码,这将使得类设计人员无法在不破坏现有代码的情况下对类内部进行更改。

看着它的另一种方法,实例变量是标记为私人与子类的程序员合同的一部分,而标记为私有的哪些不是。

这意味着实例变量通常应该标记为private,以便只有通过它们的访问器方法才能访问它们(如果有的话)。否则,有人可以轻松地编写你的类的子类,并简单地创建一个访问器来公开任何实例变量。

+0

感谢您的详细解答。至于编写一个子类来公布实例变量,我很肯定'@ private'不能防止类别公布它们。思考? – 2009-12-19 17:47:15

+1

我试过了,你绝对正确。看起来类别可以访问所有实例变量,包括私有变量。我认为Objective-C仍然给你足够的绳索,如果你真的想要:) – 2009-12-19 18:05:10

+1

你还可以使用运行时功能来抓住伊娃。但是,如果你正在做这样的事情,你知道这是一个肮脏的黑客,不像天真地依靠一个你认为是可靠的超级IVAR。 – Chuck 2009-12-19 19:26:13

1

如果您不希望子类能够访问变量,请将它们标记为@private。

0

这样做的另一种方法是在@implementation部分中声明实例变量。这些变量隐含地是私有的。来源:Kochan:编程Objective-C,第四版。页。 199.因此,正如e.James所述,类声明必须显示所有实例变量,这是不正确的。

在@interface中声明实例变量的唯一原因是允许它们被派生类(子类)继承。

+0

正确的做法是将其在.m文件的类扩展中声明。这适用于私人方法以及ivars和属性。类扩展看起来像一个未命名的类别'()',但具有不同的语义和功能。 – ikuramedia 2012-02-17 10:52:19