iOS开发基础-属性关键字

目录

一.weak

二.strong

三.copy

四.atomic

五.nonatomic

六.assign

七.retain

八.readwrite

九.readonly


在ARC下,不显示指定关键字时,默认为:

普通数据:atomic、readwrite、assign

普通OC对象:atomic、readwrite、strong

一.weak

打开ARC时才会使用,相当于assign,可以把对应的指针变量重置为nil。

一般用于修饰UI控件,如下图所示:

如图所示,只要我们创建的控件加入到subViews中,那这个控件就会一直存在,我们所创建的指针是weak还是strong只是多加一条虚线还是实线的区别。但是如果remove了这个控件,那么如果创建的指针是strong,那么我们就还引用着一个没有用的对象,占用内存。因此一般使用weak修饰UI控件。

二.strong

打开ARC时才会使用,相当于retain。

  • 用于修饰OC对象类型(NSArray、NSDate、NSNumber、模型类等)

  • 一个对象只要被强指针引用着,就不会被销毁

三.copy

NSString、NSArray、NSDictionary等经常使用copy关键字,因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,为确保对象中的属性不会无意间变动,应该在设置新属性值时拷贝一份,保护其封装性。

block使用copy是从MRC遗留下来的习惯,在MRC中,方法内部的block是在栈区的,使用copy可以把它放到堆区。在ARC中写不写都行,对于block使用copy还是strong效果都是一样的,但建议写上copy,告知调用者编译器会自动对block进行copy操作。

  • 一般用在NSString*类型、block类型上。

  • copy语法的作用:

    • 产生副本

    • 修改了副本并不会影响源对象,修改了源对象,并不会影响副本。

四.atomic

atomic使系统自动生成的getter/setter方法会进行加锁操作,仅仅保证了getter/setter存取方法的线程安全,但不能保证整个对象都是线程安全的。不写默认atomic。

五.nonatomic

nonatomic使系统自动生成的getter/setter方法不会进行加锁操作,线程存取不安全,但速度更快,当多个线程同时访问同一个属性时,会出现无法预料的结果。如果没有多线程之间的通讯,使用nonatomic是更好的选择。

六.assign

不会使引用计数器加1,直接赋值。用于基本数据类型、枚举、结构体等非OC对象类型。

与weak的区别:

weak对象遭到摧毁时,系统会将对象的指针指向nil,在OC给nil发消息是不会有什么问题,如果使用assign修饰对象,对象遭到摧毁时,指针还是会指向原来的对象,由于对象已经被摧毁,此指针会变为野指针。再向此对象发送消息时,很容易造成程序崩溃。因此assign可以用于修饰非OC对象,但是不能修饰OC对象。

七.retain

会使用引用计数加1.

八.readwrite

此标记说明属性会被当成读写的,这也是默认属性。

九.readonly

此标记说明属性只可以读,不能设置,可以获取。

 

参考:

属性关键字的使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值