声明属性时视图控制器和普通模型类之间的区别?

时间:2014-04-30 14:01:16

标签: objective-c

我只是想弄清楚如何使用类扩展来拥有私有变量。 我注意到的是普通类中没有类扩展的默认代码。 当我尝试使用 @property 声明变量时,它不允许我在ViewController中键入 @protected @private ,它只允许我拥有 @property @optional @required

所以,我的问题是,有什么理由吗?有什么区别,是什么让它与众不同......?

1 个答案:

答案 0 :(得分:2)

您没有发布任何代码,让我们推断您在做什么。我会假设它是这样的:

@interface ViewController ()

@property id someProperty; // This works

@private
id someVar; // This does not work

@end

@implementation ModelClass
{
  @property id someProperty; // This does not work

  @private
  id someVar; // This works
}

@end

假设这是真的,似乎你对属性与实例变量的性质感到困惑。 @property本质上是一种声明访问器方法的方法,编译器(默认情况下)为其自动合成方法实现和相应的后备实例变量。另一方面,实例变量只是每个实例变量,而不是方法。

上面的第一个代码块是ViewController上的类扩展。类扩展允许您声明其他方法 - 从而也是@properties - 与类的主/公共接口分开。

第二个块中@implementation之后的大括号表示一个声明其他实例变量的地方(仅限)。

@protected@private是实例变量声明的可见性修饰符,并控制实例变量是否仅对类本身的实例(@private),类的实例和它的子类(@protected)或公开(@public)。这些修饰符不能用于方法(@properties是一种特殊情况)。毕竟,在Objective-C中,方法实际上总是公开的,因为只有在运行时才将消息发送转换为方法调用,并且编译器不能真正强制限制对“私有”方法的调用。 / p>

最后,为了回答我认为是你问题的核心,你肯定可以为你的模型类添加一个类扩展,以便声明额外的“私有”@properties和其他方法。 Xcode可能不包含非视图控制器的默认新文件模板中的一个,但这并不意味着您不能自己添加一个:

@interface ModelClass ()

@property id somePrivateProperty; // Works just fine

@end