浅谈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)可以避免频繁申请/释放内存。
浅谈cocosd之autorelease\retain\release的理解的更多相关文章
- SDUT OJ 数据结构实验之串一:KMP简单应用 && 浅谈对看毛片算法的理解
数据结构实验之串一:KMP简单应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
- 对cocos2d 之autorelease\ratain\release的理解
前言: 三种情况,引出问题 new出来的对象需要释放,而释放时,如果有其他人引用了这个对象,再次使用这个对象时,则会导致无效指针报错. 于是有了引用计数的施放管理机制. 对 ...
- 【转】对cocos2d 之autorelease\ratain\release的理解
原文链接:http://blog.sina.com.cn/s/blog_4057ab6201018y4y.html Objective C内存管理进阶(二):理解autorelease: http:/ ...
- 浅谈兔兔对Object.defineProperty的理解
给一个对象定义一个新的属性或者在修改一个对象现有的属性,并返回这个对象 语法: Object.defineProperty(参数1,参数2,参数3) 参数1:目标对象 参数2:要修改或者添加的属性名称 ...
- Spring 学习教程(一):浅谈对Spring IOC以及DI的理解
一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...
- 浅谈Objeact.clone克隆(纯个人理解,如有错误请指正)
现在先来看一下jdk给出的Object.clone源码和注释 /** * Creates and returns a copy of this object. The precise meaning ...
- Linux系统/dev/mapper目录浅谈
Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/mapper/VolGroup-lv_root和/de ...
- [转帖]Linux系统/dev/mapper目录浅谈
Linux系统/dev/mapper目录浅谈 Linux系统的一般的文件系统名称类似于/dev/sda1或/dev/hda1,但是今天在进行系统维护的时候,利用df -h 命令敲出了/dev/ma ...
- 浅谈dedecms模板引擎工作原理及其自定义标签
浅谈dedecms模板引擎工作原理: 理解织梦模板引擎有什么意思? 可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步. 理解织梦会使我们写PHP代码是更顺手,同时能学 ...
随机推荐
- [线性DP][codeforces-1110D.Jongmah]一道花里胡哨的DP题
题目来源: Codeforces - 1110D 题意:你有n张牌(1,2,3,...,m)你要尽可能多的打出[x,x+1,x+2] 或者[x,x,x]的牌型,问最多能打出多少种牌 思路: 1.三组[ ...
- Tess4J -4.0.2- Linux 实践 [解决:Tess4J - Native library (linux-x86-64/libtesseract.so) not found in resource path]
[本文编写于2018年7月5日] Tess4J是Tesseract的Java JNA wrapper.本文介绍了在CentOS 7 操作系统中使用Tess4J的步骤及注意事项.在正式开始之前,先花一点 ...
- 3.hive的thriftserver服务
1.ThiftServer介绍 正常的hive仅允许使用HiveQL执行查询.更新等操作,并且该方式比较笨拙单一.幸好Hive提供了轻客户端的实现,通过HiveServer或者HiveServer2, ...
- 详讲H5、WebApp项目中常见的坑以及注意事项
首先我们中会有一些常用的meta标签,如下: <!--防止手机中网页放大和缩小--> <meta name="viewport" content="wi ...
- 你应该知道的PHP库
Libchart – 这也是一个简单的统计图库. JpGraph – 一个面向对象的图片创建类. Open Flash Chart – 这是一个基于Flash的统计图. RSS 解析 解释RSS并是一 ...
- Beta周王者荣耀交流协会第三次Scrum会议
1.立会照片 成员王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐. master:王玉玲 2.时间跨度: 2017年11月12日 18:00 — 18:20 ,总计20分钟. 3.地点: 一食 ...
- 人生苦短,我用Python!
一.程序分析 1.读取文件到缓冲区 def process_file(): # 读文件到缓冲区 try: # 打开文件 f = open("C:\\Users\\panbo\\Desktop ...
- Java微笔记(7)
String 类常用方法 注意点: 字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1 使用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引:如果没有匹配 ...
- 如何防止app接口被别人调用
app开发的时候,如何保护app的接口呢? 用https是我想到的办法,但是不知道怎么实现,所以就考虑用token,虽然不是绝对有效,但是能防止一般的用户来攻击,高手非要攻击,只能报警了吧. toke ...
- prototype.js中Function.prototype.bind方法浅解
prototype.js中的Function.prototype.bind方法: Function.prototype.bind = function() { var __method = this; ...