为什么 cocos2d-x schedule 更改了成员对象?
Why cocos2d-x schedule changed the member object?
我在 cocos2d-x 项目中有这两个 类:
class A : public Layer
{
...
B * b;
void callAddNumber(float dt);
}
A::A()
{
b = B::create();
}
void A::callAddNumber(float dt)
{
b->addNumber();
}
class B : public Node
{
...
int number;
B();
void addNumber();
}
B::B()
{
number = 100;
}
void B::addNumber()
{
number += 1;
}
和对象调用shschedule(schedule_selector(A::callAddNumber), 1.0f);
但数字并没有像我预期的那样增加;似乎在我安排之后,b 对象就被释放了? b->number 变成了垃圾号码?为什么会这样?
我确定我在 A 的构造函数中初始化了 b
。
您没有显示相关代码。
通常 ::create() returns 一个指向 AutoRelease 对象的指针。该对象将在下一帧释放,除非有人先保留()它。
所有从 Ref 继承的对象都应该在使用 retain()/release() 策略管理的堆和内存上创建。
那就是任何想要保留对它们的引用的人都必须在他接受引用时调用方法retain()
,并记住在它被销毁时或释放对象之前调用release()
。
在 ::create() 上,一个对象被添加到 autoRelease 队列中。这是一个对象队列,将在下一帧之前全部释放。因此,除非有人在此之前调用 ::retain() ,否则对象将被释放。
(您可以使用侵入式智能指针包装器让所有这些簿记工作消失)
我在 cocos2d-x 项目中有这两个 类:
class A : public Layer
{
...
B * b;
void callAddNumber(float dt);
}
A::A()
{
b = B::create();
}
void A::callAddNumber(float dt)
{
b->addNumber();
}
class B : public Node
{
...
int number;
B();
void addNumber();
}
B::B()
{
number = 100;
}
void B::addNumber()
{
number += 1;
}
和对象调用shschedule(schedule_selector(A::callAddNumber), 1.0f);
但数字并没有像我预期的那样增加;似乎在我安排之后,b 对象就被释放了? b->number 变成了垃圾号码?为什么会这样?
我确定我在 A 的构造函数中初始化了 b
。
您没有显示相关代码。
通常 ::create() returns 一个指向 AutoRelease 对象的指针。该对象将在下一帧释放,除非有人先保留()它。
所有从 Ref 继承的对象都应该在使用 retain()/release() 策略管理的堆和内存上创建。
那就是任何想要保留对它们的引用的人都必须在他接受引用时调用方法retain()
,并记住在它被销毁时或释放对象之前调用release()
。
在 ::create() 上,一个对象被添加到 autoRelease 队列中。这是一个对象队列,将在下一帧之前全部释放。因此,除非有人在此之前调用 ::retain() ,否则对象将被释放。
(您可以使用侵入式智能指针包装器让所有这些簿记工作消失)