iOS OC中strong,weak,assign,copy等的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS OC中strong,weak,assign,copy等的区别相关的知识,希望对你有一定的参考价值。

参考技术A 1、strong表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。当然强行将其设为nil可以销毁它。
strong表示对一块内存强引用,当strong类型的指针指向一块内存,这块内存的引用计数就加1,相反则减1。当一块内存的引用计数为0时则销毁这块内存。

2、weak表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。
weak表示一个指针对一块内存进行弱引用。弱引用就是不增加所指向内存的引用计数。

3、assign主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值主要存在于栈上。不涉及内存管理,内存计数不变化,如果修饰对象类型的话会出现野指针或者EXC_BAD_ACCESS错误。

4、weak 一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。

5、copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。

6、@property 这个关键词的唯一作用就是声明getter、setter方法接口

7、@synthesize 实现setter、getter方法,找不到实例变量则主动创建一个

8、@dynamic 语义是用户要求自动生成setter getter方法,系统不会自动生成,所以此时调用setter或getter方法会crash,编译不报错(oc的动态绑定机制),而且调用对应的实例变量会报错

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

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

11、unsafe_unretained类型指针指向一块内存时,内存的引用计数也不会增加,这一点与weak一致。但是与weak类型不同的是,当其所指向的内存被销毁时,unsafe_unretained类型的指针并不会被赋值为nil,也就是变成了一个野指针。对野指针指向的内存进行读写,程序就会crash。

浅拷贝即指针拷贝,
深拷贝不但拷贝了对象的指针,还在系统中在分配了一块内存用来存放拷贝对象的内容

以上是关于iOS OC中strong,weak,assign,copy等的区别的主要内容,如果未能解决你的问题,请参考以下文章

iOS之weak和strong懒加载及循环引用

iOS - strong 和 assign的区别

iOS weak和strong的区别

ios中关键词weak,assign,copy.strong等的区别

iOS中assign,copy,retain之间的区别以及weak和strong的区别

iOS 开发 property,strong,weak,retain,assign,copy,nomatic 的区别及使用