Iya

  • 本帖最后由 walzer 于 2012-6-30 15:22 编辑 *

我查了下2.0.1的代码,应该不会呀。CCArray在构造函数里就先把data初始化为NULL , 然后紧接着调用init, 进而调到initWithCapacity(1), 在最后这个函数里面调用ccArrayNew(capacity) 分配了一块内存给data用。

所以CCArray构造之后,调用count(), capacity()这些函数时,data指针都应该是有效的。

你是如何初始化CCArray的。

unsigned int CCArray::count()
{
    return data->num;
}

内存错误有可能是data指针没有初始化。

— Begin quote from ____

子龙山人 发表于 2012-6-26 09:56 url

你是如何初始化CCArray的。内存错误有可能是data指针没有初始化。

— End quote

我看api调用的CCArray::array();来初始化的。
我分析也是data没有初始化。

— Begin quote from ____

PollyYeung 发表于 2012-6-26 14:47 url

不会出错啊。我这里都没问题。
实在不行你就得CCMutableArray 的begin() 和 end() 迭代器,判断begin==end …

— End quote

我以前用的就是CCMutableArray 但是2.0取消了。才按照推荐换成了CCArray

— Begin quote from ____

PollyYeung 发表于 2012-6-26 14:53 url

我out了,我还没用过2.0,按理说吧CCArray也应该是容器吧,也按照标准设计的话就应该有开始和结束的迭代 …

— End quote

CCArray貌似木有迭代器。所以我才用count()循环遍历的。
估计是我初始化有问题。

— Begin quote from ____

PollyYeung 发表于 2012-6-26 15:19 url

哎,看了哈CCArray的源码, 也不太清楚是什么问题。好像CCArray有lastObject这个函数获取最后一个,你判 …

— End quote

一样报内存错误,我试验过了。

— Begin quote from ____

LittleDing 发表于 2012-6-26 15:32 url

也许可以试试检查别的地方。
上次遇到和你一样的问题,后来发现是另一个地方的内存操作越界,误写到CCArray …

— End quote

嗯,也是个思路。我排除下去试试。

— Begin quote from ____

PollyYeung 发表于 2012-6-26 16:22 url

那就别用2.0,回归1.0吧。

— End quote

尝鲜下,现在api是2.1的,引擎是2.0有的方法都不一样。。。
还是1.x时代吧。

— Begin quote from ____

PollyYeung 发表于 2012-6-28 14:40 url

我查了找到遍历的方法了
pArray是一个CCArray指针
遍历方法如下

— End quote

thank you 我试试去。

CCArray *aObject = CCArray::array();
aObject->retain(); // This is the key point

aObject->addobject(obj);

— Begin quote from ____

stevesz 发表于 2012-6-29 11:48 url

CCArray *aObject = CCArray::array();
aObject->retain(); // This is the key point

— End quote

aObject->retain();这句我加了,只要数组里没东西调用count()一样报内存错误。
retain()方法是保存?什么概念呢?

初始化完立即进行retain 接下来再进行相关的操作 比如 count

retain的动作理论上不应该加才对 不知道2.0有什么变动 或许是一个bug 先这样用吧

— Begin quote from ____

snowcrow0802 发表于 2012-7-2 13:14 url

我加了 retain(); 就可以正常使用了

— End quote

不是吧。。。难道我rp差。。。。。。

我觉得你那个应该是没有retain…

果然是retain的问题。。。。。

CCArray *pArray = CCArray::array();
int size = pArray->count();
CCLog(“size:%d”,size);
这样写没有报错,结果为0