美文网首页Ios自己面试总结工具程序员
OC基础——assign、retain、copy使用异同

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

作者: 时间已静止 | 来源:发表于2016-05-30 21:56 被阅读510次

    虽然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

    相关文章

      网友评论

      • wg689:可变对象为深拷贝(指针赋值且在堆里面将对象赋值一份,引用计数不变),不可变对象为浅拷贝(只对指针赋值然后引用计数+1) ?

        不可变的不需要加1 可变的重新分配内存了 需要加1吧??
        吃人的豹子:不变说的是以前那个对象的引用计数不变,新拷贝了一个对象,这个新对象引用计数肯定是1。作者说的没错
        时间已静止:@haojingxue_iOS 原来的不变 新拷贝的引用计数为1

      本文标题:OC基础——assign、retain、copy使用异同

      本文链接:https://www.haomeiwen.com/subject/redqdttx.html