@property
@property在Objective-C中的作用是生成存取方法.当存取方法被生成后,就可以使用形如 实例名.属性名
这种格式来访问实例变量.虽然这种方式和C++的访问对象成员的形式很像,但是在ObjC中的这种方法其实是调用了实例的存取方法而已.所以
1 | myCar.type = "SUV"; |
这种写法其实是与
1 | [myCar setType:@"SUV"]; |
等价.
@synthesize
@synthesize
是将存取方法和变量关联起来.
- 如果写入这样的代码:
1
@synthesize type = _type
那么就是将实例变量_type和存取方法关联起来.我们可以这么用:
1 | _type = "SUV" |
- 第二种情况:
1
@synthesize type
那么,关联的实例变量就是type
1 | type = "SUV" |
- 从Xcode4.4开始,@synthesize不用手动添加,因为系统会自动添加.情况和第一种情况一样,即系统将自动添加
1
_type = "SUV"
假如 property 名为 foo,存在一个名为 _foo 的实例变量,那么将不会合成新的变量.
1 | @interface myClass : NSObject |
提示:Auto property synthesis will not synthesize property ‘_myInt’ because it cannot share an ivar with another synthesized property.
在interface大括号中声明的变量
在interface
大括号中声明的变量和@property
中声明的属性有什么不同呢?
- 在
interface
大括号中声明的变量不能在类外访问,而属性可以在类外访问. - 在
property
中声明的属性,系统会自动生成getter
,setter
.也可以手动添加getter
,setter
.
1 | @interface myClass : NSObject |
此时生成的myClass类的对象拥有一个ivar:name
.
1 | @interface myClass : NSObject |
此时生成的myClass类的对象拥有两个ivar:name
和_name
.使用点运算符
访问到的将是_name
.
注意,在特定情况下,推荐使用点运算符或者访问方法来访问变量:
- 在非ARC的情况下,使用属性会自动生成retain/release的代码.
- 如果属性被
atomic
修饰,使用属性会提供线程安全的功能,然而直接访问ivar不是线程安全的.