属性,实例变量和成员变量

本文详细解析了Objective-C中的属性、实例变量及成员变量之间的区别,并深入探讨了@synthesize指令的作用,以及如何通过属性的修饰符来实现内存管理和线程安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AppDelegate 常看见如下写法: 

@synthesize window=_window;   意思是说,window 属性为 _window 实例变量合成访问器方法。 

解析: 

意思是说window属性生成存取方法 :setWindow方法,而这个方法就是实际变量 _window的 的存取方法,setwindow操作的就是_window这个方法。

PS:window是属性,而_window是实际的变量

注意:

通过这个看似是赋值的这样一个操作,我们可以在@synthesize 中定义与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问


那么属性、实例变量和成员变量的区别是什么?


(1)实例变量和成员变量


由上图看出,@interface括号中间统称为“成员变量”,实例变量是由类定义的变量,是成员变量的一种。

严格说来, 上图中的  int  count;  是一个成员变量。  而 NSString * name;  是一个实例变量。

  • 成员变量用于类内部,无需与外界接触的变量。
  • 根据成员变量的私有性,为了方便访问,所以就有了属性。属性的好处就是允许让其他对象访问到该变量。当然,你可以设置只读或者可写等,设置方法也可自定义。所以,属性是用于与其他对象交互。

(2)属性

属性的声明如下:

@proterty(修饰词)类名 *属性名,中有修饰词要填写(也可以不填写取默认值),包括:

访问器方法名

默认与属性相关的getter 和 setter 方法是这样的形式: propertyName  和 setPropertyName  例如,有个属性叫 “foo”, 访问器则应当是foo 跟 setFoo:. 下面的结构则允许我们指定个性化的名字来取代上面的默认形式。它们都是可选的,可以出现在任何其它额外属性中(除了setter=中的 readonly ).

getter=getterName

指定属性的get访问器名。getter 返回值类型必须符合属性类型并且getter方法中不能有任何参数。

setter=setterName

指定属性的 set 访问器名。setter 方法必须带有一个与属性类型一样类型的参数,并且返回值类型为 void.

假如你指定了一个属性为 readonly 并且用 setter=指定了一个 setter方法, 编译器就会给出警告。

通常你指定的访问器方法名应当符合键值编码标准(参考 Key-Value Coding Programming Guide)—通常我们使用 getter 修饰器的原因是为了遵循布尔值的属性命名约定.

可写性

这些额外属性指定了是否一个属性与set访问器关联了。这些选项是互斥的。

readwrite

知名属性属性是 read/write. 默认是这个选项。

 getter 跟 setter 方法都要放在 @implementation 块中. 要是你在实现块中使用 @synthesize指令,  getter 和 setter 方法则将被集成。

readonly

指明属性是只读的。

如果你指定了 readonly, 那么 @implementation 块中只需要一个getter方法. 要是你在实现块中使用 @synthesize指令,  那么只有 getter 方法会被集成。除此之外,假设你试图使用逗点语法给一个只读属性赋值,编译器将会报错。

Setter 语法

这些额外属性指明了set访问器的语法。这些选项是互斥的。

strong

指明此属性跟目标对象有着紧密的(拥有)关系(将某个内存区域的指针赋值给变量,同时引用计数+1)。

weak

指明与目标对象是松散的(非拥有)关系。

假如目标对象被释放了,属性值将自动被设为 nil.

( OS X v10.6 和 iOS 4不支持弱属性; 取而代之的是 assign.)

copy

指明对象的副本应当用于赋值操作。

之前的值发送给一个 release 消息.

副本通过调用 copy 方法被创建. 除了对象类型(实现了 NSCopying  协议),对其它类型这个额外属性是无效的。

assign

指明 setter 使用简单赋值(引用计数不发生变化)。这个额外属性是默认选项。

在基本数据类型和C数据类型中你会用到这个额外属性,例如 NSInteger 和 CGRect.

retain

指明对象赋值时执行 retain 。

之前的值将发给一个 release 消息。

在 OS X v10.6 以及更新的版本中,你可以使用 __attribute__ 关键字来指定一个 Core Foundation 属性应当被当做一个用于内存管理的 Objective-C 对象对待。

@property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;
原子性

你可以使用这个额外属性来指明访问器方法是非原子的。 (没有关键词可以表示原子的)

nonatomic

指明访问器是非原子的。默认情况下,访问器是原子的。

属性默认是原子的,这种情况下生成的访问器提供了多线程环境下对属性的安全访问/存取互斥互斥,同一时刻,只有一个线程可以访问属性。

要是你指定了 strongcopy 或者 retain 并且没有指定 nonatomic 那么在一个引用计数环境中,为属性生成的get访问器将使用lock, retain ,自动释放返回的值,然后才返回结果。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值