@property 属性类型归纳和介绍

一. atomic 与 nonatomic

1.atomic : 原子性的, 默认拥有该属性, 这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题

2.nonatomic: 非原子性的, 如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

二.readwrite 与 readonly(这两个属性的真正价值在于不是提供成员变量访问接口,而是控制成员变量的访问权限)

1.readwrite : 可读可写,这个属性是默认的情况,会自动为你生成存取器

2.readonly : 只读, 这个属性只会生成getter方法,不会生成setter方法

三. assign、copy、retain

1.assign : 默认类型, setter方法直接赋值,不进行任何retain操作,不改变引用计数,一般用来处理基本数据类型(主要针对 基本数据类型)

2.retain : 释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1,我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象的内容(主要针对除NSString 类以外的NSObject 和 其其他子类)

3.copy : 与retain处理流程一样,先对旧值release,再copy出新的对象, retaincount 为1,为了减少对上下文的依赖而引入的机制,我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其的引用计数为1. 对copy属性要特别注意: 被定义有copy属性的对象必须要符合NSCopying协议,必须实现 -(id)copyWithZone:(NSZone *)zone 方法(主要针对 NSString)

四.strong 与 weak

1.strong : 强引用,也是我们通常说的引用,其存亡直接决定所指对象的存亡,如果一个不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放,不管其他弱引用是否指向它,对象都会被释放掉

2.weak : 弱引用,不决定对象的存亡,即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除

你可能感兴趣的:(@property 属性类型归纳和介绍)