iOS开发也有一个多月了,偶然间发现经常是自己乱用@property和@synthesize,根本不知道是做什么的。故恶补了一通。
@property用来定义一个类的属性,类似C++中得成员变量
@synthesize表示由编译器来自动实现属性的getter/setter方法,不需要手动实现
在iOS 6.0 SDK下,定义一个属性,但是没有@synthesize,也存在属性的getter/setter方法,但是需要用“self.属性名”或者“_属性名”
在我们看别人的代码的时候,有的代码是@synthesize 属性名,有的是@synthersize 属性名=_属性名。这就不明白了,怎么会多出一个_呢,都是干什么的呢?
这是一个比较基本的问题,也关乎我们理解Objective-C中对类、类的属性、类的存取器、类的局部变量的统一理解。
//ios开发,现在的xcode环境都是再64-bit环境下,不存在以下问题,不过也要懂一下
在32位系统中,如果类的 @interface 部分没有进行 ivar 声明,但有 @property 声明,在类的 @implementation 部分有响应的 @synthesize,则会得到类似下面的编译错误:Synthesized property ‘xX’ musteither be named the same as a compatible ivar or must explicitly name an ivar
上面声明部分的 @synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
也就是说,window属性生成存取方法是setWindow,这个setWindow方法就是_window变量的存取方法,它操作的就是_window这个变量。通过这个看似是赋值的这样一个操作,我们可以在@synthesize中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。
来个demo看下:
第一种情况:
@interface MyClass:NSObject{
MyObjecct *_oc;
}
@property(nonamtic, retain) MyObjecct *oc;
@end
@implementatin MyClass
@synthesize oc=_oc;
这个类中声明了一个变量_oc,又声明了一个属性叫oc,然后用@synthesize生成了属性oc的存取方法,这个存取方法的名字应该是:setOc和getOc。@synthesize oc=_oc的含义就是属性oc的存取方法是做用于_oc这个变量的。这种用法在Apple的Sample Code中很常见。
第二种情况:
@interface MyClass:NSObject{
}
@property(nonamtic, retain) MyObjecct *oc;
@end
@implementatin MyClass
@synthesize oc=_oc;
oc是属性,而_oc才是变量,我们最终操作的变量都是oc(属性)。