声明类属性 Objective-C



我开始学习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]标记了一个错误

此外,如果将属性的实现更改为不使用实例变量,则如果未显式声明实例变量,它将消失,并且意外使用它(+initdealloc中的那些)将被标记为错误。

另一个没有提到的区别:

在第一种情况下,label具有受保护的访问权限。默认情况下,实例变量@protected如果未另行声明。

另一方面,在第二种情况下,label是私有的(至少在我的编译器中)。

当您有子类时,这种差异很重要。

最新更新