【问题标题】:Variable disappears in the middle of a method while debugging调试时变量在方法中间消失
【发布时间】:2015-08-18 16:57:21
【问题描述】:

我的 NSMutableArray 对象在函数中间消失了。 游戏.h:

@interface Game : NSObject
{
    NSMutableArray* boardPositions;
}

游戏.m:

boardPositions=[[NSMutableArray alloc]initWithObjects:[[NSMutableString alloc]initWithString:@" "], nil];

[Players playTurnWithPlayerTurn:playerTurn andBoardPositions:boardPositions];

Players.m:

+(void) playTurnWithPlayerTurn:(BOOL)playerTurn andBoardPositions:(NSMutableArray*)boardPositions
{
    //Printing "X turn" or "O turn"
    if (playerTurn) {
        NSLog(@"O turn");
    }
    else
        NSLog(@"X turn");

    NSLog(@"Where do you want to insert the %c?",playerTurn?'O':'X');//boardPositions disappears
    char input[3];
    gets(input);
    NSString *inputString=[NSString stringWithUTF8String:input];

    //Checking user's input and implementing his choice to the board
    if ([inputString isEqualToString:@"0,0"]) {
        [boardPositions replaceObjectAtIndex:0 withObject:playerTurn?@"O":@"X"];
    }

有人知道怎么解决吗?

它从这里消失了,我无法访问它:
之前:
http://i.stack.imgur.com/s6BEa.jpg
之后:
http://i.stack.imgur.com/LqPu2.jpg

【问题讨论】:

  • “在函数中间消失”是什么意思?提供有关问题的具体细节。
  • 请看我添加的链接
  • 如果您的问题清楚地提到您正在谈论它在单步执行代码时在调试器中消失,那将会有所帮助。将调试器窗格底部的“auto”更改为“local”。
  • 现在我看到了,但它是空的,在'Before'图片中有9个对象,在它之后是“0x100112800”,我无法访问它。

标签: ios objective-c debugging nsmutablearray


【解决方案1】:

在调试器栏上,根据您的情况将设置从 Auto 更改为 LocalAll Variables。 (本地应该在调试方法时保持你的变量)

见下图:

【讨论】:

  • 现在我看到了,但它是空的,在'Before'图片中有9个对象,在它之后是“0x100112800”,我无法访问它。
  • 这不仅仅是告诉我它是空的,所以覆盖描述将无济于事,我无法访问它,如果我尝试它会因以下错误而崩溃:“线程 1:EXC_BAD_ACCESS (code=1 , 地址=)"
  • 我无法重现您的错误,在我的代码中显示正常,我可以看到对象。 (NSString 对象)如果您对此有特定的问题,我建议您针对您的问题提出另一个问题。
  • 我在 Xcode 6.x 中遇到过同样的问题,至少两次(我认为是 6.3)。调试器似乎失去了它的想法,并且不再可以访问您的任何程序(当前堆栈帧中的全局变量和变量。)当这种情况发生时,我不得不退出并重新启动 Xcode,然后一切都回到了正常。
【解决方案2】:

这可能与您使用类方法而不是实例方法有关。使用实例方法制作模拟版本,看看是否保留了数组。如果是这样,那么您就迈出了解决方案的第一步。另外,我假设您的数组上没有其他操作,并且它没有从超出范围的另一个函数中释放。

【讨论】:

    【解决方案3】:

    您在使用 ARC 吗?替换:

    @interface Game : NSObject
    {
        NSMutableArray* boardPositions;
    }
    

    与:

    @interface Game : NSObject
    {
       @property(nonatomic, strong) NSMutableArray* boardPositions;
    }
    

    并将您对 boardPositions 的其他引用更改为 self.boardPositions。如果您不再使用它,编译器可能会优化您的数组。

    【讨论】:

    • 哇! _boardPositions,而不是 self.boardPositions,这行得通!谢谢大佬给我指路!试了几个小时!非常感谢!
    • 它将显示为 _boardPositions,但您可以在控制台中使用 self.boardPositions 访问它。如果它停止工作,您可能需要将更改备份到以前的工作状态。您可以单步执行您的代码并在每一步之后键入“po self.boardPositions”(不带引号)以查看发生了什么。在你的“initWithObjects”调用之后放置一个断点,然后单步执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2020-07-09
    • 2020-09-13
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多