浅谈cocosd之autorelease\retain\release的理解


三种情况,引出问题:

1)new出来的对象需要释放,而释放时,如果有其他人引用了这个对象,再次使用这个对象时,则会出现野指针情况。

==> 于是出现了引用计数的释放管理机制。

2) 对于一个返回对象指针的方法,你若不看文档不看内部代码,你无法知道这个指针需不需要你来释放。同样的对于将一个指针或者对象作为参数给一个方法后, 你也无法知道这个方法会不会将你的对象释放掉。

==> 于是出现了谁拥有谁释放的管理思想。

3使用上述管理机制和思想后,有些特定情况。比如方法内新建一个对象,然后返回对象时,按照谁拥有谁释放的思想,对象是在方法内部创建的,方法退出前需要释放掉这个对象,但又要在退出时返回这个对象,先返回还是先释放都是不对的。

==> 于是出现了autorelease。

1、release和retain是配套的,释放管理是通过引用计数的。

每一个CCObject对象都有一个引用计数。retain()是引用计数+1,release()时引用计数-1。在release()之后,如果引用计数为0,便会delete this,真正释放自己的内存。CCObject新建的时候,引用计数默认为1。

2、release和retain的使用指导思想是:谁拥有谁释放。

对于一个需要释放的变量。它的生命中通过新建、传递参数、方法返回 出现在各个地方,然而只有有人需要长期使用它时,才应调用retain(),释放时秉承“"谁retain谁release",retain和release调用次数需要配套使用。

3、autorelease是一个特殊的release,即延后释放。

autorelease的对象会加入到池中,最迟会在主循环结束前释放。

池是用栈形式管理的。在适当情况下新建一个自动释放池,加入到栈中。所有要自动释放的对象都会提前加入到当前栈顶的这个池中。在特定情况下(如每次主循环结束前),将池出栈。出栈时,做一些释放池中对象的处理。

当CCObject释放时,如果该对象仍在自动释放池中,则从池中删除自己。

同一个对象多次autorelease()的话,会多次加入池中。池中对象存储的结构是CCMutableArray,也就是vector。

4、使用autorelease的好处

1)new出来的对象释放问题解决了。符合谁拥有谁释放原则。

2)可以避免频繁申请/释放内存。

优质内容筛选与推荐>>
1、Web Server 在iis下部署php网站在iis下
2、Spring入门(二)——DI
3、js判断是pc还是手机
4、TCP/IP 协议
5、【MySQL】存储引擎


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号