Objective-C:int值无变化

时间:2009-12-21 18:11:48

标签: objective-c memory pointers int

Objective-C:我需要帮助保留int的值。没有我的命令,它正在改变我。

最初的问题是:“你如何声明并保留一个int?”,这在另一篇文章中得到满足:Objective-C: How do you declare and retain an int?

现在我遇到一个问题,即18的int变为2,不知何故单独使用。

这是我的代码:

@interface Game : Layer // this is from cocos2d
{
   int maxSprites;
}

@implementation Game
-(void)initVariables
{
  maxSprites = 18;
}

稍后,当我打印出来时,比如

 NSLog(@" maxSprites = %d  ", maxSprites);

我明白了:

 maxSprites = 2

要求它为18,崩溃或不起作用的操作,好像它现在真的只有2个。

怎么可能? =)

Apple + Shift + F 显示maxSprites变量没有其他用法。

我查看了其他代码示例,并且经常使用getter和setter公开变量,并且他们也在使用@property。我错过了什么吗?我是Objective-C的新手,所以我不妨这样做!

我为maxSprites做了 Apple + Shift + F “在Project,Textual,Contains,Ignore Case中,结果只是:< / p>

       Game.h:  int maxSprites;
       Game.m:  maxSprites = 18;
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@" maxSprites  = %d", maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);
       Game.m:  NSLog(@"maxSprites is at %p", &maxSprites);

我使用观察点找到了它所发生变化的位置。它改变了

    Expression: “*(int *) 67379960”
    New Value: 2
    Old  Value: 18

在这一行:

   [self checkMatchBarAward:spriteTypeToAdd];

奇?该函数对maxSprites没有任何作用,也没有。{/ p>

编辑: 这是函数,我在其中注释了所有内容并且它仍然出现: .h

    -(void)checkMatchBarAward:(int)spriteTypeToAdd;

.m

     -(void)checkMatchBarAward:(int)spriteTypeToAdd
      {
      }

编辑:

感谢您的建议。我已清理所有目标,但仍然更改了值。由于你们/ gals给出的答案,你引导我解决问题。感谢您的所有帮助。

我在下面的答案中发布了我的结果。这是一份副本:

你不会相信原因是什么的男人/女孩。感谢您的帮助,因为我告诉我要清理并查看并检查我的类型,这有帮助。

我查看了我的阵列。我发现了一个声明如下:

  int matchBarArray[8];

从断点处停止2行,它表示值从18变为2,我有这一行:

  matchBarArray[spritesCaptured-1] = spriteTypeToAdd;

猜猜看,我超越了数组的界限1.如果我将数组的大小增加到9,我就不再将int从18变为2。

另外,如果我超过1超过界限,也就是说,我将数组大小减小到更小,还有其他的事情开始改变,比如我的得分,布尔值,整个游戏! =)

我无法相信在Objective-C中击中阵列外的内存可能导致这样的暴乱=)而且它很难调试!

3 个答案:

答案 0 :(得分:3)

伙计/女孩,你不会相信原因是什么。感谢您的帮助,因为我告诉我要清理并查看并检查我的类型,这有帮助。

我查看了我的阵列。我发现了一个声明如下:

  int matchBarArray[8];

从断点处停止2行,它表示值从18变为2,我有这一行:

  matchBarArray[spritesCaptured-1] = spriteTypeToAdd;

猜猜看,我超越了数组的界限1.如果我将数组的大小增加到9,我就不再将int从18变为2。

另外,如果我超过1超过界限,也就是说,我将数组大小减小到更小,还有其他的事情开始改变,比如我的得分,布尔值,整个游戏! =)

我无法相信在Objective-C中击中阵列外的内存可能导致这样的暴乱=)而且它很难调试!

答案 1 :(得分:2)

如果您的checkMatchBarAward:方法确实为空,则需要清理项目( Shift + cmd + k )并重建它。

答案 2 :(得分:0)

我没有看到您在代码中指定的行。

然而,很有可能你指的是一个很长的东西*当它是一个int *或类似的东西时(虽然这些年后,C STILL怎么看不到我的东西)。

无论如何,请检查您的类型,其中指出的大小可能会有所不同。如果你引用一个带有long *的int *内存位置(例如,通过将int *传入一个需要long *的方法),你将会对堆栈进行fubar并开始修改相邻的变量。

我不止一次这样做,但在C中,不是目标C - 所以我不确定这是正确的答案。