iOS @property和@synthesize的用法

当定义了一系列的变量时,需要写很多的getter和setter方法,而且它们的形式都是差不多的,所以Xcode提供了@property和@synthesize属性,@property用在 .h 头文件中用作声明,@synthesize用在.m 文件中用于实现。
在X-code4.5以前,在.h中声明完属性之后,如:
@property(nonatomic,assign)  int age;
@property(nonatomic,assign) NSString *name;
需要在.m中写上
@synthesize int age;
@synthesize NSString *name;
系统会自动去实现setter和getter方法

而在X-code4.5之后,@synthesize就不需要再写了,系统会直接去实现setter和getter方法。
另外,声明完property属性之后,会自动生成下划线,如_age、_name;如果不想要下划线,那么就可以使用@synthesize去修饰,例如,在.m中写@synthesize age;那么_age就会变成age


在Objective-C中,@是Objective-C的标志,证明您正在使用Objective-C语言!

针对Objective-C语言中的关键词@property与@synthesize的使用进行了一个简要的分析(自己所理解的).

下面是自己编写的一个例子:建立一个Person类,其中省略了方法的声明.


1)在.h头文件中:

@property在头文件中应用于声明:

例如:

@property NSInteger age;

编译器会自动在.h头文件中声明了2个方法:(setter,getter方法)

- (NSInteger)age;      - (void)setAge:(NSInteger)age;

2)在.m实现文件中:

@sythesize在.m实现文件中应用于实现:

例如:

@synthesize age = _age; 

编译器会自动在.m文件中实现2个方法:(setter,getter方法)

- (void)setAge:(NSInteger)age

{

           _age  =  age;

}

- (NSInteger)age

{

           return   _age;

}

请注意:

在Xcode4.5以后的版本中,可以省略@synthesize,编译器会自动添加getter和setter方法的声明和实现,同时会默认访问_age这个成员变量,如果找不到这个变量,会自动生成_age的私有成员变量.


3)@property语法的写法:

例如:

@property(nonatomic, retain) NSString *name;

@property(nonatomic, copy)NSString *gender;



其中在@property后的()括号中的参数如下:(以及其意义)

readwrite:可以产生和使用getter和setter方法.

readonly:只产生和使用getter方法,不能产生和使用setter方法.

assign:默认类型,在setter中直接进行赋值使用的,不进行retain操作

retain:setter方法中,对参数进行release释放旧值,再retain新值.释放旧对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为1.

copy:setter方法进行copy操作,与retain一样, 建立一个引用计数为1的对象,然后释放旧对象

nonatomic:禁止多线程,变量保护,提高性能

atomic:系统默认,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。

strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡,如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放.

weak:弱引用,不决定对象的存亡,即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除

setter=: 对setter方法重新定义一个名字.

getter=: 对getter方法重新定义一个名字.




据上述所说的参数类型中,copy和retain是最为复杂的,下面就这两项进行一个简要的分析:

retain:

例如:

@property(nonatomic, retain) NSString *name;

1)setter方法分析:

- (void)setName:(NSString *)name

{

    if ( _name != name) {   //判断是否与旧值相同

         [ _name  release ];  //若新值与旧值不同则将旧值释放

        _name = [ name retain ];  //赋予新值,此时的引用计数+1

      }

}

2)getter方法分析:

- (NSString *)name

{

return [ [ _name retain ]  autorelease ];

}


copy:

例如:

@property(nonatomic, copy)NSString *gender;

1)setter方法如下:

- (void)setGender:(NSString *)gender

{

    if ( _gender != gender) { //判断是否与旧值一样

        [ _gender   release ] ;    //释放旧值

        _gender = [ gender copy ];  //进行对原值的拷贝,开辟新的空间,将地址拷贝,并将新的空间的引用计数+1

      }

 }

2)getter方法如下:

- (NSString *)gender

{

       return  [ _gender retain ] autorelease ];

}

注意:

1)nonatomic:如果使用多线程,有时会出现两个线程互相等待对方导致锁死的情况(具体可以搜下线程方面的注意事项去了解)。在没有(nonatomic)的情况下,即默认(atomic),会防止这种线程互斥出现,但是会消耗一定的资源。所以如果不是多线程的程序,打上(nonatomic)即可

2)Objective-C语言,系统默认是ARC模式,所以不论是copy或者retain中的setter和getter,通过@synthesize自动生成getter和setter方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值