转载

assign、retain、copy使用异同

1 三者的区别

首先,assign、retain、copy肯定是在ARC环境下。引用计数的概念:表示对象被引用的次数。当引用计数为 0 的时候,系统就会发送dealloc消息来释放内存。只有OC对象才有引用计数,core foundation框架的对象为c对象,没有引用计数。

assign:用于基本数据类型,没有引用计数,因此不存在增加或减少引用计数;

retain: 对象引用计数会+1;

copy:

1 可变对象为深拷贝(指针赋值且在堆里面将对象赋值一份,引用计数不变),不可变对象为浅拷贝(只对指针赋值然后引用计数+1)。所谓深拷贝就是给指针赋值且指向的对象也拷贝一份,浅拷贝只给指针赋值不拷贝对象。

2 可变与不可变对象的转变:不可变对象→可变对象的转换:对象.mutableCopy。可变->不可变:对象.copy;

3 为什么可变对象与不可变对象有深浅拷贝之分呢?很简单,出于对节省内存的考虑。对于不可变对象,因为它不可变,所以无论有多少使用者,都是同一份东西,那么我只要在内存中保留一份即可。而对于可变对象,假设甲乙都引用了A,甲改变了A,如果乙再使用可能就会引起错误。

2 释放方法

release:对象引用计数-1,如果为 0 则发送 dealloc 释放内存;

autorelease:只是把对象放入自动释放池,这是一个编译器属性,编译器会在合适的地方调用autorelease。 MRC 与 ARC:手动管理内存和自动管理内存,(先说下引用计数)手动管理需要程序员调用 retain release 等方法来手动管理内存。自动管理是把对象指针放进自动释放池,当自动释放池被销毁时发送 release 消息。

正文到此结束
Loading...