AppDelegate 常看见如下写法:
@synthesize window=_window; 意思是说,window 属性为 _window 实例变量合成访问器方法。
解析:
意思是说window属性生成存取方法 :setWindow方法,而这个方法就是实际变量 _window的 的存取方法,setwindow操作的就是_window这个方法。
PS:window是属性,而_window是实际的变量。
注意:
通过这个看似是赋值的这样一个操作,我们可以在@synthesize 中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。
那么属性、实例变量和成员变量的区别是什么?
(1)实例变量和成员变量
由上图看出,@interface括号中间统称为“成员变量”,实例变量是由类定义的变量,是成员变量的一种。
严格说来, 上图中的 int count; 是一个成员变量。 而 NSString * name; 是一个实例变量。
- 成员变量用于类内部,无需与外界接触的变量。
- 根据成员变量的私有性,为了方便访问,所以就有了属性。属性的好处就是允许让其他对象访问到该变量。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性是用于与其他对象交互。
属性的声明如下:
@proterty(修饰词)类名 *属性名,中有修饰词要填写(也可以不填写取默认值),包括:
访问器方法名
默认与属性相关的getter 和 setter 方法是这样的形式: propertyName 和 set
PropertyName , 例如,有个属性叫 “foo”, 访问器则应当是foo
跟 setFoo:
. 下面的结构则允许我们指定个性化的名字来取代上面的默认形式。它们都是可选的,可以出现在任何其它额外属性中(除了setter=中的 readonly
).
-
指定属性的get访问器名。getter 返回值类型必须符合属性类型并且getter方法中不能有任何参数。
-
指定属性的 set 访问器名。setter 方法必须带有一个与属性类型一样类型的参数,并且返回值类型为
void
.假如你指定了一个属性为
readonly
并且用setter=
指定了一个 setter方法, 编译器就会给出警告。
getter=getterName
setter=setterName
通常你指定的访问器方法名应当符合键值编码标准(参考 Key-Value Coding Programming Guide)—通常我们使用 getter
修饰器的原因是为了遵循布尔值的属性命名约定.
这些额外属性指定了是否一个属性与set访问器关联了。这些选项是互斥的。
-
知名属性属性是 read/write. 默认是这个选项。
getter 跟 setter 方法都要放在
@implementation
块中. 要是你在实现块中使用@synthesize
指令, getter 和 setter 方法则将被集成。 -
指明属性是只读的。
如果你指定了
readonly
, 那么@implementation
块中只需要一个getter方法. 要是你在实现块中使用@synthesize
指令, 那么只有 getter 方法会被集成。除此之外,假设你试图使用逗点语法给一个只读属性赋值,编译器将会报错。
readwrite
readonly
Setter 语法
这些额外属性指明了set访问器的语法。这些选项是互斥的。
-
指明此属性跟目标对象有着紧密的(拥有)关系(将某个内存区域的指针赋值给变量,同时引用计数+1)。
-
指明与目标对象是松散的(非拥有)关系。
假如目标对象被释放了,属性值将自动被设为
nil
.( OS X v10.6 和 iOS 4不支持弱属性; 取而代之的是
assign
.) -
指明对象的副本应当用于赋值操作。
之前的值发送给一个
release
消息.副本通过调用
copy
方法被创建. 除了对象类型(实现了NSCopying
协议),对其它类型这个额外属性是无效的。 -
指明 setter 使用简单赋值(引用计数不发生变化)。这个额外属性是默认选项。
在基本数据类型和C数据类型中你会用到这个额外属性,例如
NSInteger
和CGRect
. -
指明对象赋值时执行
retain
。之前的值将发给一个
release
消息。在 OS X v10.6 以及更新的版本中,你可以使用
__attribute__
关键字来指定一个 Core Foundation 属性应当被当做一个用于内存管理的 Objective-C 对象对待。@property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;
strong
weak
copy
assign
retain
原子性
你可以使用这个额外属性来指明访问器方法是非原子的。 (没有关键词可以表示原子的)
-
指明访问器是非原子的。默认情况下,访问器是原子的。
nonatomic
属性默认是原子的,这种情况下生成的访问器提供了多线程环境下对属性的安全访问/存取互斥互斥,同一时刻,只有一个线程可以访问属性。
要是你指定了 strong
, copy
或者 retain
并且没有指定 nonatomic
那么在一个引用计数环境中,为属性生成的get访问器将使用lock, retain ,自动释放返回的值,然后才返回结果。