1.iOS中常用的属性修饰符有哪些?

修饰符 描述
nonatomic 非原子性,决定编译器生成的setter、getter 方法是非原子操作,线程不安全
atomic 原子性,保证setter和getter存取的线程安全,默认atomic
readonly 只读性,只生成getter方法
readWrite 可读可写性,生成setter和getter方法,默认使用
assign 赋值特性, setter方法将传入参数直接赋值给实例变量
retain 持有特性,setter将传入参数先保留,在赋值,传入参数retainCount会+1
strong 持有特性,和retain一样,多用于ARC
copy 拷贝特性,需要完全一份新的变量时setter方法将传入对象复制一份,一般用于block不可变的字符串,数组,字典等
weak 弱引用,一般用来修饰delegate
__unsafe_unretain 当对象被释放后,指针依然保存着之前的地址
  • atomic:

设置成员变量的属性时,默认是atomic,提供线程安全的。 添加一些线程锁,防止数据在写入未完成的时候被其他线程读取,造成数据错误,默认使用。

  • nonatomic:

非原子性,线程不安全,在写入的时候其他线程也可以对其进行访问,获取当前的值。优点:提高效率。

  • assign:

对基础数据进行赋值(NSIntegerCGFloat)和C数据类型(int, float,double, char),BOOL类型等。存储在栈中,内存不用我们管理。

  • retain,strong(ARC):

一般用于修饰NSObject和其子类,指向并持有该对象,引用计数会加1。引用计数为0销毁,可以通过将变量强制赋值 nil 来进行销毁。

  • copy:

在赋值是使用传入值的一份拷贝。copy关键字和 strong类似,copy多用于修饰有可变类型的不可变对象上 NSString,NSArray,NSDictionary上。block(用strong也可以)等。

  • __unsafe_unretain:

__unsafe_unretain类似于 weak ,但是当对象被释放后,指针依然保存着之前的地址,被释放后的地址变为 僵尸对象,访问被释放的地址就会出问题,所以说他是不安全的。

  • __weak 和 __unsafe_unretain 的区别?

__unsafe_unretain 在指向的内存地址销毁后,指针本身并不会自动销毁,这也就造成了野指针,之后容易造成 Crash__weak 在指向的内存销毁后,可以将指针变量置为nil,这样更加安全。

  • copy和strong的使用场景:

copy多用于修饰有可变类型的不可变对象上 NSString,NSArray,NSDictionaryblock等,原因:不论是用strong还是copy修饰的对象,其指针指向的地址依然还是原对象的地址,但一般我们想要一个不可变的,所以用copy,而他们的可变类型为什么要用strong修饰呢?如果原字符串是NSMutableString的时候,使用strong只会增加引用计数。但是copy会执行一次深拷贝(self语法会调用setter方法,里面会执行一次copy方法生成新的对象,指针和对象都不是原来的了),会造成不必要的内存浪费。

  • NSMutableArray可以用copy修饰吗?

不可以,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。


WechatIMG1.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。