Objective-C - @property的参数总结


/*

 Objective-C - @property的参数总结

 

     1> 回顾@property的功能:

         1,自动生成私有的带下划线的属性;

         2,自动的生成这个属性的setter/getter方法的声明;

         3,自动的生成这个属性的setter/getter方法的实现;

         

         setter的实现,直接赋值;getter的实现,直接返回.

         

         注意: 生成的是不含内存管理代码的setter方法.

         

     

     2> @property的参数:@property可以带参数,带不同的参数可以实现不同的功能.

     

         语法:@property(参数1,参数2,...)数据类型 数据名称;

         

         "1,与多线程相关的参数

         

             atomic :默认值.生成的setter/getter方法是很安全的方法,安全但是性能低下.

             

             nonatomic:生成的setter/getter方法不安全,但是效率高.

             

             (注意:无论是在MRC还是在ARC模式下,推荐使用nonatomic,不写的话默认是atomic).

         

         

         "2,与生成setter方法实现相关的参数

         

             assign:默认值.如果使用assign,生成的setter方法的实现中,就是直接将参数的值赋值给属性.

             

             retain:生成的setter方法中,是标准的MRC内存管理代码.如下:(YYCar *_car为例)

             - (void)setCar:(YYCar *)car

             {

                if(_car != car)

                {

                    [_car release];

                    _car = [car retain];

                }

             }

             

             (当属性的类型是oc对象的时候,就使用retain.当属性的类型是非oc对象的时候,就使用assign).

             (但是并不会在dealloc中也生成release代码,所以dealloc中的release需要自己去写).

                

            "注意:retain只能使用在MRC模式下,当属性的类型是oc对象的时候,绝大多数场景下使用retain.

                 assign可以使用在ARCMRC模式下.

                    ARC模式下,当属性的类型是非oc对象的时候,一律使用assign;

                    MRC模式下,当属性的类型是非oc对象的时候,一律使用assign,二者相同.

                    

                    MRC模式下,出现循环引用的侍候 ,一边使用assign,一边时用retain.

 

         "3,strong:如果使用strong来修饰类的属性,代表@property生成的私有属性是一个强类型的.

            weak:如果使用weak来修饰类的属性,代表@property生成的私有属性是一个弱类型的.

         

            注意:ARC机制下,setter方法的实现,不需要做别的什么事情,直接复制就可以,所以MRC下的retainARC无法使用.

         

            总结:ARC机制下,如果属性的类型是oc对象类型的,绝大多数情况下使用参数strong,如果属性的类型是非oc对象类型的,绝大多数情况下使用assign,也就是相当于把MRC下的retain换成了strong.

            

            "注意:strong只能使用在ARC模式下,当属性的类型是oc对象类型的,绝大多数情况下使用参数strong;

                 weak:只能使用在ARC模式下,当出现循环引用的时候,一边使用strong,一边使用weak.

 

 

             

         "4,与生成只读,读写封装相关的参数

         

             readwrite:默认值.同时生成setter/getter方法.

             

             readonly:值生成getter方法,不生成setter.

         

         

         "5,与指定生成的setter/getter方法的名称相关的参数

         

             setter:可以指定生成的setter方法的名称;

             语法:setter = abc,即生成的setter方法的名称是abc,: - (void)abc:(YYCar *)car;

             

             getter:可以指定生成的getter方法的名称;

             语法:getter = abc,即生成的getter方法的名称是abc,: - (YYCar *)abc;

             

             只有当属性的类型是BOOL类型的时候,我们可以修改getter方法的名称,以提高代码的阅读性:

             :@property(getter = isGoodMan) BOOL goodMan;

             :YYPerson *xiaoming = [YYPerson new];

             xiaoming.goodMan = YES;

             

             NSLog(@"%d", xiaoming.isGoodMan);

 

 

             

             

             注意:参数的顺序没有要求,同一组参数不可以同时使用.

 */

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值