美文网首页
iOS 修饰符使用

iOS 修饰符使用

作者: lkm_0bdc | 来源:发表于2023-06-18 11:14 被阅读0次

iOS属性的修饰符包括三个方面
读写权限修饰符:\color{red}{ readwrite,readonly }
线程安全:\color{red}{ nonatomic,atomic }
内存管理:\color{red}{ strong,weak,assign,copy,retain }

内存管理的本质是什么?
因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

strong

属于强引用表示指向并拥有该对象,其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。如果强行设置为nil可以销毁它。

retain

retain和strong效果一样,引用计数加1,ARC下已经不再使用,用strong代替

weak

属于弱引用表示指向但不拥有该对象,其修饰的对象的引用计数不会增加,ARC模式使用,相当于assign,对象废弃可以把对应指针变量置为nil的状态,只可以修饰对象,不可以修饰基本数据类型。在ARC中有可能会出现循环引用的情况,往往通过其中一端使用weak来解决, 比如delagate代理属性,自身已经对它有过一次强应用,没有必要再强引用一次,这个时候也会使用weak。

assign

主要用于修饰基本数据类型,例如int,NSInteger,CGFloat等,这些数值主要存在于栈上不涉及内存管理,内存技术不改变,如果修饰对象类型的话会出现野指针或者EXC_BAD_ACCESS错误

Copy

建立一个索引计数为1的对象,在赋值的时使用传入值的一份拷贝,适用于NSString和block。block 使用 copy 是从 MRC 遗留下来的“传统”,在 MRC 中方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区。在 ARC 中对于 block 使用 copy 还是 strong 效果是一样的,如果不写 copy ,这样在作用域外调用该block程序就会崩溃,该类的调用者有可能会忘记或者根本不知道编译器会自动对 block 进行了 copy 操作,他们有可能会在调用之前自行拷贝属性值。

\color{red}{ 浅拷贝:}只创建一个新的指针,指向原指针指向的内存
\color{red}{ 深拷贝:}创建一个新的指针,并开辟新的内存空间,内容拷贝自原指针指向的内存,并指向它

atomic(默认属性)

当前进程进行到一半,其他线程来访问当前线程,可以保证先执行完毕当前线程。只是保证setter/getter完整,不是线程安全。atomic修饰的设值、取值方法使用了自旋锁确保线程同步虽然设值、取值方法是原子操作,但不代表是线程安全

nonatomic(非默认属性)

两个线程同时访问同一个属性将会导致无法预计的结果。优点是程序运行速度快

相关文章

网友评论

      本文标题:iOS 修饰符使用

      本文链接:https://www.haomeiwen.com/subject/urajydtx.html