@property与@synthesize作用

参考:http://my.oschina.net/iamzkt/blog/126503

访问器(Accessor),也就是我们所知道的setter和getter方法。

访问器是很重要的技术,用来访问和设置对象的实例变量(不是对象本身,而是对象中的属性)


下面是简单访问器

//setter
-( void )setStuName:(NSString *)stuName
   //_stuName 是实例变量
      if (_stuName != stuName)
      {
         [_stuName release];
          _stuName = [stuName copy];
      }
   }
//getter
   -(NSString *)stuName
   {
      return _stuName;
   }
setter方法中涉及到一定的内存管理。

而@property和@synthesize可以有以上作用,前者用于声明,后者用于合成访问器,结合使用就可以合成访问器了。


@interface Student : NSObject
   
@property (nonatomic, copy) NSString *stuName;
@end
 
@implementation Student
 
@synthesize stuName = _stuName;
@end
以上代码和上面代码效果相同。

原子性

atomic(默认):atomic意为操作是原子的,意为着只有一个线程访问实例变量。atomic是线程安全的至少在当前线程上是安全的。它是一个默认的,但很少使用,因为比较慢,和ARM平台和内部锁机制有关。

nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问,速度比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

访问控制器

readwrite(默认):表示同时拥有setter和getter

readonly:表示只有getter没有setter

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

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

存在的副作用是KVC与KVO无法正常工作

内存管理

retain:使用了retain意味着实例变量要获取传入参数的所有权。具体表现为setter中对实例变量先release然后将参数retain之后传给它。

-( void )setStuName:(NSString *)stuName
   {
      if (_stuName != stuName)
      {
         [_stuName release];
          _stuName = [stuName retain];
      }
   }
assign(默认):用于值类型,如int,float,double,NSInteger和CGFloat表示单纯的复制。还包括不存在所有权关系的对象,如常见的delegate
strong:是在ARC伴随IOS引入的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好能体现对象的关系。
weak:weak跟assign的效果相似,不同的是weak在对象被回收之后自动设置为nil。而且weak只能用在iOS5或以后的版本,对于之前的版本,使用unsafe_unretained
unsafe_unretained:weak的低版本替代。
copy:copy是为实例变量保留一个自己的副本。
-( void )setStuName:(NSString *)stuName
   {
      if (_stuName != stuName)
      {
         [_stuName release];
          _stuName = [stuName copy];
      }
   }


@synthesize myObject=_myObject的含义就是属性myObject的存取方法是做用于_myObject这个变量的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值