property(2) - 修饰属性的关键字

1、nonatomic 和 atomic (默认)

修饰实例变量,使其线程中是否安全,或者高效

atomic用于多线程中,是原子性的(即它的方法有加锁和解锁的过程)
nonatomic用于单线程,非原子性,因为没有加锁和解锁的过程所以效率比atomic的高但是其安全隐患大


2、assign(默认,MRC、ARC都有)

用于CGFloat、NSInteger、基本数据类型(c类型)
用于不保留变量的对象、即相当创建弱引用从而避免循环引用的发生

- (void) (assign) setter:(type *)XXXX  
{
    _xxxx = XXXX;   /* 相当直接赋值,引用计数器不回加1 */
}

3、strong(默认) 和 weak (仅ARC中有)

strong表示强引用关系,拥有对象的所有权(拥有对象的所有权即意味着要对其拥有的对象进行释放),引用计数器会加一

    - (void) (strong) setter:(type *)XXXX
    {
        [XXXX retain];      //新值引用计数加一保留
        [_xxxx release];    //旧值引用计数减一释放 
        _xxxx = XXXX;      
    }

weak表示弱引用关系,不拥有对象的所有权,目标对象销毁之后,属性会设置为nil

    - (void) (weak) setter:(type *)XXXX
    {
        _xxxx = XXXX;   /* 相当直接赋值,引用计数器不回加1 */
    }
    //当[XXXX release] , _xxxx == nil

4、copy(ARC、MRC都有)

copy引用计数加一,操作一个内存,注意在源对象可变(浅拷贝)不可变(深拷贝)时候的问题

- (void) (copy) setter:(type *)XXXX
    {
        [XXXX retain];      //新值引用计数加一保留
        [_xxxx release];    //旧值引用计数减一释放 
        _xxxx = [XXXX copy];      //返回一个不可变的类型
    }
5、retain

retain为当前对象指向的对象 引用计数+1保证不被释放


6、readwrite (默认) 和 readonly

用于限制是否能用点方法(setter方法)外部修改实例变量 (可以通过内部修改)

@interface xxxx

//这里属性会自动生成实例变量_name
@property (readwrite) NSString *name;            
//readwrite会生成setter、getter方法

@end

在setter方法中_name = name(为NSString *的指针),调用点方法(setter方法)时从内存理解如下:
这里写图片描述
在getter方法中,为return _name;

@interface xxxx
                                                //这里属性会自动生成实例变量_name
@property (readnoly) NSString *name;             //readonly只生成getter方法

@end

因为没有setter方法,所以没有_name = name ,所以不能用点方法来改变,但是依旧可以用其它的方式改变_name;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值