objective-c中的属性
property中的声明列表已分类为以下几种:
1, 声明属性的访问方法:
getter=getterName
setter=setterName
声明访问属性的设置与获取方法名。
2,声明属性写操作权限:
readwrite
声明此属性为读写属性,即可以访问设置方法(setter),也可以访问获取方法(getter),与readonly互斥。
readonly
声明此属性为只读属性,只能访问此属性对应的获取方法(getter),与readwrite互斥。
3,声明写方法的实现:
assign
声明在setter方法中,采用直接赋值来实现设值操作。如:
1 -(void)setName:(NSString*)_name{
2 name = _name;
3 }
retain
声明在setter方法中,需要对设过来的值进行retain 加1操作。如:
1 -(void)setName:(NSString*)_name{
2 //首先判断是否与旧对象一致,如果不一致进行赋值。
3 //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。
4 if ( name != _name){
5 [name release];
6 name = [_name retain];
7 }
8 }
copy
调用此实例的copy方法,设置克隆后的对象。实现参考retain。
4,访问方法的原子性:
nonatomic
在默认的情况下,通过synthesized 实现的 setter与getter 都是原子性访问的。多线程同时访问时,保障访问方法同时只被访问一个线程访问,如:
1 [ _internal lock ]; // lock using an object-level lock
2 id result = [ [ value retain ] autorelease ];
3 [ _internal unlock ];
4 return result;
但如果设置nonatomic时,属性的访问为非原子性访问。
总结: 需要全局访问的变量尽量声明成属性来进行赋值,声明成成员变量无法保持引用计数的一致性从而导致崩溃,在内部访问数据时使用成员变量或属性都是可以的,在对属性进行赋值时,会调用属性的set方法,使引用计数加一从而保证内存的正确引用。
补充:移动开发 , 其他 ,