cocos2d-x工厂方法

工厂方法是程序设计中一个经典的设计模式,指的是基类中只定义创建对象的接口,将实际的实现推迟到子类中。
如:
1 CCObject* factoryMethod() {
2    CCObject* ret = new CCObject();
3    //在这里对ret对象进行必要的初始化操作
4    return ret;
5  }

这段看起来正常的代码其实隐藏着一个问题:工厂方法对ret对象的引用在函数返回时已经结束,但是它没有释放对ret的引用,埋下了内存泄露的隐患。但是,如果在函数返回前就执行release(),这显然是不合适的,因为这会触发对象的回收,再返回的对象指针就成为了错误指针。

 
autorelease()方法很好地解决了这个问题。此函数结束时我们已经丧失了对ret的引用,为了把ret对象传递给接受者,需要对它进行一次autorelease操作,这是因为虽然我们调用了autorelease方法,但是对象直到自动回收池释放之前是不会被真正释放掉的(通常Cocos2d-x会在每一帧之间释放一次自动回收池),调用者有足够的时间来对它进行retain操作以便接管ret对象的引用权。因此,Cocos2d-x的执行机制很巧妙地保证了回收池中的对象不会在使用完毕前释放。利用autorelease()修改后的工厂方法如下:
 
1 CCObject* factoryMethod() {
2    CCObject* ret = new CCObject();
3    //这里对ret对象进行必要的初始化操作
4    ret->autorelease();
5  //这里已经加入自动回收池,但是引用计数还是1,并没有真正的释放,在下一帧开始前,才会被释放,所以这次即使调用了自动回收,仍然可以返回对象的引用。
6    return ret;
7  }
原文地址:https://www.cnblogs.com/Blogs-young-chan/p/5223431.html