iOS日常开发之property修饰符以及各个修饰符区别

本文探讨了iOS开发中@property修饰符的作用,包括atomic与nonatomic的线程安全性、readwrite与readonly的访问权限、assign、strong、weak和copy的内存管理特性,以及setter和getter的自定义选项。理解这些修饰符对于优化代码性能和保证线程安全至关重要。

一.@property

OC的属性(property)是通过用@property定义的公有或者私有的方法。属性(property)提供了一种安全、便捷的方式来与这些属性(attribute)交互,而不需要手动编写一系列的访问方法,如果需要的话可以自定义getter和setter方法来覆盖编译器自动生成的相关方法。

尽量多的使用属性(property)而不是实例变量(attribute)因为属性(property)相比实例变量有很多的好处:

(1)自动合成getter和setter方法。当声明一个属性(property)的时候编译器默认情况下会自动生成相关的getter和setter方法更好的声明一组方法。

(2)因为访问方法的命名约定,可以很清晰的看出getter和setter的用处。

二.@property后面有哪些修饰符

1、线程安全(atomic、nonatomic)

  • atomic:原子性:OC使用的是一种线程保护技术,从基本上讲,是防止在未完成的时候被另一个线程更改,造成数据错误。而这种机制是耗费系统资源,所以在iPhone这种小型设备上,如果没有使用多线程之间的通讯编程,那么nonatomic是一个非常好的选择。
  • nonatomic:非原子性: 禁止多线程,变量保护,提高性能。

原子性:默认

这个属性是为了保证程序在多线程下,编译器会自动生成自旋锁代码,避免该变量的读写不同步问题,提供多线程线程,多线程只有一个线程对它访问。

注意:

(1)atomic原子性指的是一个操作不可以被CPU中途叫停,然后再调度。即不能被中断,要么执行完,要么不执行。

(2)atomic是自旋锁,当上一个线程没有执行完毕的时候(被锁住),下一个线程会一直等待,不会进入睡眠,当上一个线程执行完毕后,下一个线程会立即执行。它区别于互斥锁,互斥锁在等待的时候,会进入睡眠状态,当上一个线程执行完毕之后,会被唤醒,然后再执行。

(3)atomic需要消耗大量的资源,执行效率低

但是atomic并不保证线程安全,因为只会保持set内部安全,在外面并不能保证安全!详情请见面试题集锦之第3点

2、访问权限

  • readwrite:默认 拥有getter/setter方法,可读可写
  • readonly:只读属性,只会生成getter方法,不会生成setter方法

3、内存管理

  • assign :适用于基本数据类型:NSInteger,CGFloat和C数据类型int,float等,另外还有id类型
  • strong:对应MRC中的retain,强引用,只有OC对象才能使用该属性,它使对象的引用计数加1
  • weak:弱引用,只是单纯引用某个对象,但是并未拥有该对象,即一个对象被持有无数个弱引用,只要没有强引用指向它,那么它就会被清楚释放。
  • copy:拷贝

4、指定方法名称: setter= getter=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值