【@property的特性】

@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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值