【问题标题】:C Array with memory problems in Objective CObjective C中存在内存问题的C数组
【发布时间】:2026-02-10 18:00:02
【问题描述】:

当我第二次运行具有该数组的 Cocos2d 场景时,我的 C 布尔值数组没有保持它们的值。应用程序第一次启动时,c 数组工作正常并按预期响应,但是在场景被解除分配然后重新运行后,c 数组不会保留分配给它的值。我在下面的代码中做错了什么吗?

//.h
@interface GameplayLayer : CCLayer {
  bool playerLog[4];
  Hero *hero;
}

//.m
@implementation 
- (void)ccKeyDown:(NSEvent*)keyDownEvent{
    // Get pressed key (code)
    UInt16 keyCode = [keyDownEvent keyCode];
    // Set pressed key to true
    if (keyCode == 123) playerLog[0] = TRUE; // Left
    if (keyCode == 124) playerLog[1] = TRUE;  // Right
    if (keyCode == 126) playerLog[2] = TRUE;  // up
    if (keyCode == 125) playerLog[3] = TRUE;  // down
    // Other keys
    if (keyCode == 27) { } // Escape
}

 - (void)ccKeyUp:(NSEvent*)keyUpEvent
 {
     UInt16 keyCode = [keyUpEvent keyCode];
     // Set pressed key to true
     if (keyCode == 123) playerLog[0] = FALSE; // Left
     if (keyCode == 124) playerLog[1] = FALSE;  // Right
     if (keyCode == 126) playerLog[2] = FALSE;  // up
     if (keyCode == 125) playerLog[3] = FALSE;  // down
     // Other keys
    if (keyCode == 27) { } // Escape
}

-(void)update:(ccTime)delta {
  if (playerLog[0] == TRUE) {//false on the second run when key is pushed down}

【问题讨论】:

  • scene is deallocated这个对象有没有可能在那个时候被销毁?
  • @KarthikT 可能,但是第一次如何初始化它?还有如何初始化数组?
  • 我真的很清楚要回答的目标 C,也许它被构造函数初始化为 0?
  • @KarthikT 我刚刚尝试将 bool 声明为“bool* playerLog;”然后将其初始化为“playerLog = calloc(4, sizeof(bool));”然后像“free(playerLog);”一样释放它它似乎仍然不起作用。

标签: objective-c c memory-management cocos2d-iphone


【解决方案1】:

不管这里的原因是什么:您不应该将游戏状态保存在与视图相关的类中,在本例中为 CCLayer。

您应该有一个地方可以将游戏状态组合在一起,请在此处查看我关于共享实例的文章:http://www.cocoanetics.com/2009/05/the-death-of-global-variables/

【讨论】:

  • 我有一个名为 GameManager 的单例类,它控制着我的场景的运行和替换。
【解决方案2】:

我没有看到 init 方法,你应该创建一个 init 方法来初始化你的 ivars(尤其是playerLog[])和/或将它们设为属性。

-(id)init
{
   if (self = [super init])
   {
     playerLog[0]=playerLog[1]=playerLog[2]=playerLog[3]=0;
     hero=nil; // or allocate it, not clear from your ex. how u use that.
   }
   return self;
}

【讨论】:

    【解决方案3】:

    我建议您将您的 bool playerLog[4] 转换为 NSMutableArray 并使用,或者您可以从这个 link 尝试

    【讨论】:

    • 2-3 天我看到了你同样的问题,我问你手动 calloc、malloc 和释放内存,但很少有人反对我的回答。您仍然可以尝试答案中提到的任何一种方法。
    • 感谢您的回答,我看到了您的帖子,但不知道它的去向,因为我不知道人们对它投了反对票。我尝试了 calloc 和 malloc 方法,但它仍然不起作用。我也尝试转换为 NSMutableArray,但它仍然没有保留这些值。
    • 然后在 NSArray 中通过字符串尝试
    • 原来我的问题在于我释放场景的方式。感谢您的帮助。
    • 所以你终于做到了...恭喜:)