我开始学习Objective-C,我有一个问题:
当您声明类的属性时,这样做有什么区别?
第一种情况:
@interface ViewController : UIViewController
{
UILabel *label;
}
@property(nonatomic,retain) UILabel *label;
@end
第二种情况:
@interface ViewController : UIViewController
{
}
@property(nonatomic,retain) UILabel *label;
@end
在第一种情况下,我声明了一个具有一个属性(UILabel *label)的类,然后,我声明了该标签的属性。
在第二种情况下,我只声明属性。我一直认为我应该声明类属性。
在第一种情况下,我声明了一个带有一个 atribute (UILabel *label) 的类,稍后,我声明了该标签的属性。
不,你不是。 在第一种情况下,您将声明一个名为 label
的实例变量和一对名为 -setLabel:
和 -label
的访问器 methood(统称为属性)。 您尚未在属性和实例变量之间建立链接。 在这一点上,它们是独立的实体。
如果在实现中执行此操作:
@synthesize label = fooBar;
您是说标签属性的方法实际上使用完全不同的实例变量来支持属性。
我一直认为我应该声明类属性
我曾经也是这么想的,但实际上,如果你正在合成属性,那么单独声明 ivar 是没有意义的,因为@synthesize会为你做这件事(并且在 ARC 中将应用正确的所有权限定符)。 我现在做这样的事情:
@synthesize label = label_;
所以当我打算使用该属性时,我不使用实例变量。 例如 当我的意思是[[self label] length]
时,[label length]
标记了一个错误
此外,如果将属性的实现更改为不使用实例变量,则如果未显式声明实例变量,它将消失,并且意外使用它(+init
和dealloc
中的那些)将被标记为错误。
另一个没有提到的区别:
在第一种情况下,label
具有受保护的访问权限。默认情况下,实例变量@protected
如果未另行声明。
另一方面,在第二种情况下,label
是私有的(至少在我的编译器中)。
当您有子类时,这种差异很重要。