声明类属性Objective-C

声明类属性Objective-C,objective-c,class,properties,attributes,Objective C,Class,Properties,Attributes,我开始学习Objective-C,我有一个问题: 当您声明一个类的属性时,这样做的区别是什么 第一种情况: @interface ViewController : UIViewController { UILabel *label; } @property(nonatomic,retain) UILabel *label; @end 第二种情况: @interface ViewController : UIViewController { } @property(nonatomic,r

我开始学习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
的实例变量和一对名为
-setLabel:
-label
的访问器方法(统称为属性)。您尚未在属性和实例变量之间建立链接。在这一点上,它们是独立的实体

如果在实现中执行此操作:

@synthesize label = fooBar;
您是说label属性的方法实际上使用了一个完全不同的实例变量来支持该属性

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

我以前也这么认为,但实际上,如果您正在合成属性,那么单独声明ivar是没有意义的,因为@synthesis将为您执行此操作(在ARC中,将应用正确的所有权限定符)。我现在这样做:

 @synthesize label = label_;
因此,当我打算使用属性时,我不使用实例变量。e、 g.
[label length]
当我指的是
[[self-label]length]


此外,如果您将属性的实现更改为不使用实例变量,如果您没有明确声明实例变量,它将消失,并且意外使用它(+code>init和
dealoc
)将被标记为错误。

另一个未提及的区别:

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

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


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

可能重复我想我有一个概念问题。我们的Java老师告诉我们类有属性和方法。所以我认为UILabel*label应该是ViewController类的一个属性,我应该如何调用它?实例变量还是属性?@dpbataller我认为这是一个术语问题。附加到类实例的变量称为“实例变量”。方法称为“方法”。没有“类”变量,但有实例方法和类方法。对于实例方法,接收方(在方法内部)是类的实例。对于类方法,接收方(self)是表示类本身的对象。