我只是想弄清楚如何使用类扩展来拥有私有变量。 我注意到的是普通类中没有类扩展的默认代码。 当我尝试使用 @property 声明变量时,它不允许我在ViewController中键入 @protected 和 @private ,它只允许我拥有 @property @optional @required 。
所以,我的问题是,有什么理由吗?有什么区别,是什么让它与众不同......?
答案 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