Cocos2d-X 3.X Ref类型数据 垃圾回收机制

1、不调用autorelease()的情况

        TestVO* vo = new TestVO();
        //未调用create()方法创建,没有执行过autorelease()
        vo->init();
        //这种情况下局部变量无法被回收
        vo->release();
        //需要手动调用release()方法
        
        //CC_SAFE_DELETE(vo);
        //也可以用这种方法删除

2、调用autorelease()的情况

        TestVO* vo = TestVO::create(); //引用计数=1
        //create()方法中执行过autorelease()
        //引用计数设为1
        //在帧结束的时候引用计数-1
        //引用计数为0时被回收

3、手动调用retain()防止被删除

TestVO* vo = TestVO::create();//引用计数=1        
        vo->retain();//引用计数=2
        
        //......
        //帧结束 引用计数-1 值为1 不回收
        //......
        //下一帧开始时 引用计数+1 值为2
        //......
        
        //调用release()方法
        vo->release();//引用计数-1
        
        //......
        //帧结束 引用计数-1 值为0 被回收

4、被添加到cocos2d的数据结构时

        TestVO* vo = TestVO::create();//引用计数=1
        mList->pushBack(vo);//引用计数=2
        mList->popBack();//引用计数=1 能被回收
        
        Vector<TestVO*>* mList2 = new Vector<TestVO*>();
        mList2->pushBack(vo);//引用计数=2 无法被回收
        //如果mList2是局部变量,其他地方无法把vo从mList2中删除,vo将无法被回收

5、类的成员

如果是继承Ref类型的数据,如果用create()创建,需要在创建后调用retain()函数,否则会在帧的结束被回收。

如果是new的方法初始化的,不需要调用retain()

删除该数据或赋其他的值时,都需要调用release()方法

new 的方法创建的可以用CC_SAFE_DELETE(vo)这种方式删除。

时间: 2024-12-07 01:48:46

Cocos2d-X 3.X Ref类型数据 垃圾回收机制的相关文章

erlang二进制数据垃圾回收机制

erlang二进制数据在内存中有两种存在形式,当数据大小不到 64 bytes,就直接存在进程堆内.假设超过了64 bytes.就被保存到进程外的共享堆里,能够给节点内全部进程共享. erlang有两种二进制容器:heap binaries和refc binaries. heap binaries Heap binaries are small binaries, up to 64 bytes, that are stored directly on the process heap. They

大数据基础篇----jvm的知识点归纳-5个区和垃圾回收机制

一直对jvm看了又忘,忘了又看的.今天做一个笔记整理存放在这里. 我们先看一下JVM的内存模型图: 上面有5个区,这5个区干嘛用的呢? 我们想象一个场景: 我们有一个class文件,里面有很多的类的定义是不是,类的定义放在什么地方呢?类的定义就放在方法区里面. 程序在运行时会产生很多的对象,比如LinkList等这些对象就存放在堆里面. 栈: 我们的程序在运行时本质上就是启动线程在运行,比如main函数就是一个主线程.一个main主线程可以有很多的子线程. 线程在工作就是执行我们的各种方法.方法

JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)

如果想了解Java内存模型参考:jvm内存模型-和内存分配以及jdk.jre.jvm是什么关系(阿里,美团,京东) 相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术背景你要了解吧 二. 哪些内存需要回收? 2.1 引用计数算法 2.1.1 算法分析 2.1.2 优缺点 2.1.3 是不是很无趣,来段代码压压惊 2.2 可达性分析算法 2.3 Jav

JavaGC专家(1)—深入浅出Java垃圾回收机制

在学习GC之前,你首先应该记住一个单词:"stop-the-world".Stop-the-world会在任何一种GC算法中发生.Stop-the-world意味着 JVM 因为要执行GC而停止了应用程序的执行.当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态,直到GC任务完成.GC优化很多时候就是指减少Stop-the-world发生的时间. 按代的垃圾回收机制 在Java程序中不能显式地分配和注销内存.有些人把相关的对象设置为null或者调用Sy

垃圾回收机制GC知识再总结兼谈如何用好GC(其他信息: 内存不足)

来源 一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般有如下几种: 1.手动管理:C,C++ 2.计数管理:COM 3.自动管理:.NET,Java,PHP,GO- 但是,手动管理和计数管理的复杂性很容易产生以下典型问题: 1.程序员忘记去释放内存 2.应用程序访问已经释放的内存 产生的后果很严重,常见的如内存泄露.数据内容乱码,而且大部分时候,

java JVM垃圾回收机制

Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都在重复的allocated,然后不停的~析构.于是,有人就提出,能不能写一段程序在实现这块功能,每次创建,释放控件的时候复用这段代码,而无需重复的书写呢? 1960年 基于MIT的Lisp首先提出了垃圾回收的概念,用于处理C语言等不停的析构操作,而这时Java还没有出世呢!所以实际上GC并不是Jav

垃圾回收机制和数据结构栈链表

1.垃圾回收机制: (1)没有引用变量指向的对象,就是垃圾. 举例: Test t = new Test(); t=null; 那么之前创建的对象就是垃圾. (2)对象没有被使用是另外一种垃圾. new Test(); new Test().toString(); 区别在于第一个对象很明显没有指向,是垃圾.但是第二个不是,因为他被使用了. 2.回收时机. 通常情况下,要在满了的时候回收. 其次在调用 System.gc();//通常情况下会立刻回收.等效于Runtime.getRuntime.g

Java深度历险(四)——Java垃圾回收机制与引用类型

Java语言的一个重要特性是引入了自动的内存管理机制,使得开发人员不用自己来管理应用中的内存.C/C++开发人员需要通过malloc/free 和new/delete等函数来显式的分配和释放内存.这对开发人员提出了比较高的要求,容易造成内存访问错误和内存泄露等问题.一个常见的问题是会产生“悬挂引用(dangling references)”,即一个对象引用所指向的内存区块已经被错误的回收并重新分配给新的对象了,程序如果继续使用这个引用的话会造成不可预期的结果.开发人员有可能忘记显式的调用释放内存

JVM垃圾回收机制(一)

垃圾回收器 垃圾回收器主要负责: 1. 分配内存: 2. 保证所有正在被引用的对象还存在在内存中: 3. 回收不再被程序所引用的对象所占内存: Hotspot VM提供的垃圾回收器是一个分代的垃圾回收器(Generational GC),它将内存划分为不同的阶段,即不同生命周期的对象被放置在不同的内存空间中.这样的设计是基于弱年代假设(Weak Generational Hypothesis):大多数对象会很快变得不可达,只有很少有老对象指向新对象的引用.这种方式可以减少垃圾回收的停顿时间以及大