2

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

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

第一种情况:

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

第二种情况:

@interface ViewController : UIViewController 
{

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

@end

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

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

4

2 回答 2

2

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

不,你不是。在第一种情况下,您要声明一个名为的实例变量label和一对名为 and 的访问器方法-setLabel:-label统称为属性)。您没有在属性和实例变量之间建立任何链接。在这一点上,它们是独立的实体。

如果你在实现中这样做:

@synthesize label = fooBar;

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

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

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

 @synthesize label = label_;

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

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

于 2012-05-31T09:56:39.547 回答
0

另一个没有提到的区别:

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

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

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

于 2012-05-31T19:14:34.103 回答