【问题标题】:Declaring class attributes Objective-C声明类属性 Objective-C
【发布时间】:2012-05-31 09:38:38
【问题描述】:

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

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

第一种情况:

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

第二种情况:

@interface ViewController : UIViewController 
{

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

@end

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

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

【问题讨论】:

标签: objective-c class properties attributes


【解决方案1】:

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

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

如果你在实现中这样做:

@synthesize label = fooBar;

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

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

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

 @synthesize label = label_;

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

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

【讨论】:

  • 我觉得我的概念有问题。我们的 Java 老师告诉我们类有属性和方法。所以我认为它 UILabel * label 将是类 ViewController 的一个属性,我应该如何调用?实例变量或属性?
  • @dpbataller 我认为这是一个术语问题。附加到类实例的变量称为“实例变量”。方法称为“方法”。没有“类”变量,但有实例方法和类方法。对于实例方法,接收者(方法中的自身)是类的一个实例。对于类方法,接收者(self)是代表类本身的对象。
【解决方案2】:

另一个没有提到的区别:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2018-05-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多