属性注意点

属性注意点

@property (特性) 属性类型 属性名称

特性

以下特性影响属性的 setter 方法

// assign 
// @property (assign) NSString *name;
// 默认 setter 
- (void) setName:(NSString *)name {
	_name = name;
} 

// weak (ARC)(类似 MRC 的 assign)
// 与 assign 不同点: 当 _name 引用的对象被释放时, _name 会被立即置为 nil 。相对 assign 更安全。 _name 引用对象被释放之后,开发人员可能因为误操作继续访问 _name。这样就会造成野指针。
// @property (weak) NSString *name;
// 默认 setter 
- (void) setName:(NSString *)name {
	_name = name;
}

// retain 
// @property (retain) NSString *name;
// 默认 setter 
- (void) setName:(NSString *)name {
	name = [name retain];
	[_name release];
	_name = name;
}

// copy 
// @property (copy) NSString *name;
// 默认 setter 
- (void) setName:(NSString *)name {
	name = [name copy];
	[_name release];
	_name = name;
} 

// strong (ARC)(等同于 MRC 的 retain)
// @property (strong) NSString *name;
// 默认 setter 
- (void) setName:(NSString *)name {
	name = [name retain];
	[_name release];
	_name = name;
}

原子性影响 getter 方法:

// nonatomic 
// 使用该特性可以在多线程并发的情况中,将访问器设置为非原子性(默认是 atomic 原子性,即 setter 、 getter 都加锁,非原子性就是去锁),因而能够提供不同的结果。如果不设置,赋值和返回结果永远都会完全同步。

// https://my.oschina.net/linxiaoxi1993/blog/381332   

以后补充


问题
  1. 在 -init 方法中为什么不使用 self.属性(调用 getter 方法) 来进行设置

     因为属性有可能在 getter 方法中关联了一些其它对象,在 -init 中很可能这些对象还没有完全创建。这时候使用属性对应的实例变量。
    
posted @ 2017-04-05 11:27  上水的花  阅读(151)  评论(0)    收藏  举报