【@property的特性】

来源:互联网 发布:vscode spring boot 编辑:程序博客网 时间:2024/06/05 10:55

@property还有⼀一些关键字,它们都是有特殊作⽤用的,⽐比如上述代码中的nonatomic,strong:

@property(nonatomic,strong) NSString *carName;
@property(nonatomic,strong) NSString *carType;


我把它们分为三类,分别是:原⼦子性,存取器控制,内存管理。

一、原⼦子性

atomic(默认):atomic意为操作是原⼦子的,意味着只有⼀一个线程访问实例变量。atomic是线程安全的,⾄至少在当前的存取器上是安全的。它是⼀一个默认的特性,但是很少使⽤用,因为⽐比较影响效率,这跟ARM平台和内部锁机制有关。
nonatomic:nonatomic跟atomic刚好相反。表⽰示⾮非原⼦子的,可以被多个线程访问。它的效率⽐比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有⼀一个线程访问的情况下⼲⼴广泛使⽤用。


二、存取器控制

readwrite(默认):readwrite是默认值,表⽰示该属性同时拥有setter和getter。
readonly: readonly表⽰示只有getter没有setter。

有时候为了语意更明确可能需要⾃自定义访问器的名字:

@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;

最常⻅见的是BOOL类型,⽐比如标识View是否隐藏的属性hidden。可以这样声明:

@property (nonatomic,getter = isHidden ) BOOL hidden;

三、内存管理

@property有显⽰示的内存管理策略。这使得我们只需要看⼀一眼@property声明就明⽩白它会怎样对待传⼊入的值。
assign(默认):assign⽤用于值类型,
如int、float、double和NSInteger,CGFloat等表⽰示单纯的复制。还包括不存在所有权关系的对象,⽐比如常⻅见的delegate。

@property(nonatomic) int running;  @property(nonatomic,assign) int running;

以上两段代码是相同的。
在setter⽅方法中,采⽤用直接赋值来实现设值操作:

-(void)setRunning:(int)newRunning{ 
     _running = newRunning; 
 }


retian:在setter⽅方法中,需要对传⼊入的对象进⾏行引⽤用计数加1的操作。
简单来说,就是对传⼊入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。如下代码所⽰示:

-(void)setName:(NSString*)_name{       //⾸首先判断是否与旧对象⼀一致,如果不⼀一致进⾏行赋值。       //因为如果是⼀一个对象的话,进⾏行if内的代码会造成⼀一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,⽽而达不到赋值⺫⽬目的。       if ( name != _name){           
         [name release];            name = [_name retain];       }  
}

strong:strong是在IOS引⼊入ARC的时候引⼊入的关键字,是retain的⼀一个可选的替代。表⽰示实例变量对传⼊入的对象要有所有权关系,即强引⽤用。strong跟retain的意思相同并产⽣生相同的代码,但是语意上更好更能体现对象的关系。


weak:在setter⽅方法中,需要对传⼊入的对象不进⾏行引⽤用计数加1的操作。
简单来说,就是对传⼊入的对象没有所有权,当该对象引⽤用计数为0时,即该对象被释放后,⽤用weak声明的实例变量指向nil,即实例变量的值为0。


注:weak关键字是IOS5引⼊入的,IOS5之前是不能使⽤用该关键字的。delegate 和 Outlet ⼀一般⽤用weak来声明。


copy:与strong类似,但区别在于实例变量是对传⼊入对象的副本拥有所有权,⽽而⾮非对象本⾝身。



0 0