声明类属性Objective-C

时间:2012-05-31 09:38:39

标签: objective-c class properties attributes

我开始学习Objective-C,我有一个问题:

当你声明一个类的属性时,这样做有什么区别?

第一种情况:

@interface ViewController : UIViewController 
{
 UILabel *label;
}
@property(nonatomic,retain) UILabel *label;
@end

第二种情况:

@interface ViewController : UIViewController 
{

}
@property(nonatomic,retain) UILabel *label;

@end

在第一种情况下,我正在声明一个具有一个属性的类(UILabel *标签),之后,我正在声明该标签的属性。

在第二种情况下,我只声明属性。 我一直以为我应该声明类属性。

2 个答案:

答案 0 :(得分:2)

  

在第一种情况下,我正在声明一个带有一个属性(UILabel *标签)的类,后来,我正在声明该标签的属性。

不,你不是。在第一种情况下,您声明了一个名为label的实例变量和一对名为-setLabel:-label的访问者名称(一起称为属性)。您在属性和实例变量之间没有建立链接。他们在这一点上是独立的实体。

如果您在实施中执行此操作:

@synthesize label = fooBar;

您所说的label属性的方法实际上使用完全不同的实例变量来支持该属性。

  

我一直以为我应该声明类属性

我曾经认为相同,但实际上,如果你正在合成属性,那么单独声明一个ivar是没有意义的,因为@synthesize会为你做这个(并且在ARC中将应用正确的所有权限定符)。我现在做这样的事情:

 @synthesize label = label_;

所以当我打算使用该属性时,我不使用实例变量。例如当我的意思是[label length]

时,[[self label] length]会出现错误

此外,如果您更改属性的实现以不使用实例变量,如果您尚未明确声明实例变量,它将消失并意外使用它(+ init中的那些dealloc)将被标记为错误。

答案 1 :(得分:0)

未提及的另一个区别是:

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

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

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