我开始学习Objective-C,我有一个问题:
当你声明一个类的属性时,这样做有什么区别?
第一种情况:
@interface ViewController : UIViewController
{
UILabel *label;
}
@property(nonatomic,retain) UILabel *label;
@end
第二种情况:
@interface ViewController : UIViewController
{
}
@property(nonatomic,retain) UILabel *label;
@end
在第一种情况下,我正在声明一个具有一个属性的类(UILabel *标签),之后,我正在声明该标签的属性。
在第二种情况下,我只声明属性。 我一直以为我应该声明类属性。
答案 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
是私有的(至少在我的编译器中)。
当您有子类时,这种差异很重要。