- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近遇到一个问题。我在 cocos2d-x 中大量使用了 vector
STL。在我的一节课上,我写道:
vector<StrokeDrawnode*> strokedrawList;
StrokeDrawnode
继承自CCNode
。然而,我读到一些文章说最好使用 CCArray
来保存 CCObject
的子类。实际上,我对内存管理有疑问。我想这是问题所在。所以我的问题是我应该在什么情况下使用 CCArray
以及如何处理内存管理。
什么情况下应该这样定义类成员?
CC_SYNTHESIZE_RETAIN(CCSprite* , m_sprite_draw, Sprite);
最佳答案
在这种情况下,std::vector
和 CCArray
之间的主要区别在于,当您将对象添加到 CCArray
时,它们会被保留。这在 cocos 中非常重要,因为 CCObject
-dervied(基本上所有)对象在它们的 retainCount
达到 0 时被销毁。这是在每一帧之间自动完成的。
考虑这个例子:假设您想要创建 5 个 sprite 并将它们缓存起来供以后使用(它们要等到将来某个时间才会出现在屏幕上)。代码(在 init()
方法的某处):
for(int i = 0; i < 5; ++i) {
CCSprite *vectorSprite = (...);
CCSprite *arraySprite = (...);
_vector.push_back(vectorSprite);
_array->addObject(arraySprite);
}
_array->retain(); // < ------- IMPORTANT!
// end of init method
我们当然假设 _vector
和 _array
是实例变量,并且不会在 init()
结束时被销毁。
在绘制下一帧之前发生的是我们放入 _vector
中的所有 Sprite 都将被销毁 - 该 vector 将保存指向无效内存位置的指针。
我们放入 _array
的对象不会,因为 addObject
为我们保留了它们。请注意,_array
本身也必须保留,否则它将被销毁(我不确定它的内容)。
一般来说,我认为在处理 cocos 对象时使用 cocos-containers
可能会更好,因为您只需要记住保留容器本身,而不是所有对象。如果你真的想使用 std::vector
子类化 std::vector
可能是合理的,这样它的 push_back
和 pop_back
方法将分别保留
和realese
您的对象。
至于宏——我从未使用过它,但它扩展为:
#define CC_SYNTHESIZE_RETAIN(varType, varName, funName) \
private: varType varName; \
public: virtual varType get##funName(void) const { return varName; } \
public: virtual void set##funName(varType var) \
{ \
if (varName != var) \
{ \
CC_SAFE_RETAIN(var); \
CC_SAFE_RELEASE(varName); \
varName = var; \
} \
}
它为您的变量创建一个 setter 和 getter 以供外部使用。在我看来,只有当您想将变量公开给外部使用并自动为您提供此方法时,它才可行。这里的附加值当然是setter中完成的retain-release
过程。
如果有什么不清楚的,请告诉我!干杯。
关于c++ - 我应该使用 CCArray 在 cocos2d-x 中保存自定义 CCNode 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22681078/
问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可
我正在玩 Rank-N-type 并尝试输入 x x .但我发现这两个函数可以以相同的方式输入,这很不直观。 f :: (forall a b. a -> b) -> c f x = x x g ::
这个问题已经有答案了: How do you compare two version Strings in Java? (31 个回答) 已关闭 8 年前。 有谁知道如何在Java中比较两个版本字符串
这个问题已经有答案了: How do the post increment (i++) and pre increment (++i) operators work in Java? (14 个回答)
下面是带有 -n 和 -r 选项的 netstat 命令的输出,其中目标字段显示压缩地址 (127.1/16)。我想知道 netstat 命令是否有任何方法或选项可以显示整个目标 IP (127.1.
我知道要证明 : (¬ ∀ x, p x) → (∃ x, ¬ p x) 证明是: theorem : (¬ ∀ x, p x) → (∃ x, ¬ p x) := begin intro n
x * x 如何通过将其存储在“auto 变量”中来更改?我认为它应该仍然是相同的,并且我的测试表明类型、大小和值显然都是相同的。 但即使 x * x == (xx = x * x) 也是错误的。什么
假设,我们这样表达: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
我有一个字符串 1234X5678 我使用这个正则表达式来匹配模式 .X|..X|X. 我得到了 34X 问题是为什么我没有得到 4X 或 X5? 为什么正则表达式选择执行第二种模式? 最佳答案 这里
我的一个 friend 在面试时遇到了这个问题 找到使该函数返回真值的 x 值 function f(x) { return (x++ !== x) && (x++ === x); } 面试官
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Isn't it easier to work with foo when it is represented b
我是 android 的新手,我一直在练习开发一个针对 2.2 版本的应用程序,我需要帮助了解如何将我的应用程序扩展到其他版本,即 1.x、2.3.x、3 .x 和 4.x.x,以及一些针对屏幕分辨率
为什么案例 1 给我们 :error: TypeError: x is undefined on line... //case 1 var x; x.push(x); console.log(x);
代码优先: # CASE 01 def test1(x): x += x print x l = [100] test1(l) print l CASE01 输出: [100, 100
我正在努力温习我的大计算。如果我有将所有项目移至 'i' 2 个空格右侧的函数,我有一个如下所示的公式: (n -1) + (n - 2) + (n - 3) ... (n - n) 第一次迭代我必须
给定 IP 字符串(如 x.x.x.x/x),我如何或将如何计算 IP 的范围最常见的情况可能是 198.162.1.1/24但可以是任何东西,因为法律允许的任何东西。 我要带198.162.1.1/
在我作为初学者努力编写干净的 Javascript 代码时,我最近阅读了 this article当我偶然发现这一段时,关于 JavaScript 中的命名空间: The code at the ve
我正在编写一个脚本,我希望避免污染 DOM 的其余部分,它将是一个用于收集一些基本访问者分析数据的第 3 方脚本。 我通常使用以下内容创建一个伪“命名空间”: var x = x || {}; 我正在
我尝试运行我的test_container_services.py套件,但遇到了以下问题: docker.errors.APIError:500服务器错误:内部服务器错误(“ b'{” message
是否存在这两个 if 语句会产生不同结果的情况? if(x as X != null) { // Do something } if(x is X) { // Do something } 编
我是一名优秀的程序员,十分优秀!