通过上两篇博客,我们对Cocos引用计数和Ref类、PoolManager类以及AutoreleasePool类已有所了解,那么接下来就通过举栗子来进一步看看Coco2d-x内存运行原理是怎样的。
//先建一个node
Node * node = Node::create();
//创建完之后打印node的引用计数
schedule([node](float f){
//获得node的引用计数
int count = node->getReferenceCount();
//打印node的引用计数
log("node's ReferenceCount = %d",count);
},"test");
打印结果如下:
可以看到引用计数打印出来是一大串的整数,其实这时node已经被释放掉了是不存在的,引用计数为0,所以系统随便打印了一堆整数来表示。
我们先看一下Node类的源码,其create()方法如下:
Node * Node::create()
{
Node * ret = new (std::nothrow) Node();
if (ret && ret->init())
{
ret->autorelease();
}
else
{
CC_SAFE_DELETE(ret);
}
return ret;
}
看到这句Node * ret = new (std::nothrow) Node();首先new了一个node,我们知道Node是继承自Ref的,通过new创建对象就会调用其构造函数,而之前我们在Ref类的讲解中知道:调用Ref构造函数中会执行这句_referenceCount(1)对其引用计数+1,所以node对象起始的引用计数为1。
我们还可以看到这句:ret->autorelease(),只要通过create创建的node都会被添加到自动释放池中,我们在看下autorelease()源码:
Ref* Ref::autorelease()
{
PoolManager: