OC基础——assign、retain、copy使用异同

虽然swift是以后开发的趋势,但是OC里面的基础还是要知道,对swift的理解也会有帮助。

1 三者的区别

首先,引用计数的概念:表示对象被引用的次数。当引用计数为 0 的时候,系统就会发送dealloc消息来释放内存。

  • assign:用于基本数据类型,没有引用计数,因此不存在增加或减少引用计数;
  • retain: 对象引用计数会+1;
  • copy:
    • 1 可变对象为深拷贝(指针赋值且在堆里面将对象赋值一份,引用计数不变),不可变对象为浅拷贝(只对指针赋值然后引用计数+1)。所谓深拷贝就是给指针赋值且指向的对象也拷贝一份,浅拷贝只给指针赋值不拷贝对象。
    • 2 可变与不可变对象的转变:不可变对象→可变对象的转换:对象.mutableCopy。可变->不可变:对象.copy;
    • 3 为什么可变对象与不可变对象有深浅拷贝之分呢?很简单,出于对节省内存的考虑。对于不可变对象,因为它不可变,所以无论有多少使用者,都是同一份东西,那么我只要在内存中保留一份即可。而对于可变对象,假设甲乙都引用了A,甲改变了A,如果乙再使用可能就会引起错误。——原因是个人猜测
    • 4 最后,深浅拷贝这种说法可以区分两种拷贝,只是一种叫法,但是刚接触让人很迷糊。

2 释放方法

  • release:对象引用计数-1,如果为 0 则发送 dealloc 释放内存;
  • autorelease:只是把对象放入自动释放池,这是一个编译器属性,编译器会在合适的地方调用autorelease。
  • MRC 与 ARC:手动管理内存和自动管理内存,(先说下引用计数)手动管理需要程序员调用 retain release 等方法来手动管理内存。自动管理是把对象指针放进自动释放池,当自动释放池被销毁时发送 release 消息,引用计数-1,如果减为0则系统自动发送dealloc释放内存。
  • 另外,Core Foundation的对象为C对象,自动释放池不会接管,需要另一套:CFRetain与CFRelease。

参考:http://www.cnblogs.com/mddblog/p/4754092.html

你可能感兴趣的:(OC基础——assign、retain、copy使用异同)