【问题标题】:Switch Case Statement IssueSwitch Case 语句问题
【发布时间】:2011-01-17 17:58:19
【问题描述】:

我正在使用 switch case 语句来确定我在游戏中心多人游戏中接收到的数据。

我看不出它有什么问题,但是当添加第二个 case 语句时它停止工作。

我已经声明了:

typedef enum
{
    kPacketTypeScore,
    kPacketTypeReady,
} EPacketTypes;

typedef struct
{
    EPacketTypes type;
    size_t size;
} SPacketInfo;

typedef struct
{
    SPacketInfo packetInfo;

    int score;
} SScorePacket;

typedef struct
{
    SPacketInfo packetInfo;

    bool ready;
} SReadyPacket;

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID
{
    // first, assume it's the general SPacketInfo, that way we can access type and size
    packet = (SPacketInfo*)[data bytes];

    scoreData *scoreDat = [scoreData sharedData];
    BOOL rdyReceived;

    switch (packet->type)
    {
        case kPacketTypeScore:
        {
            SScorePacket* scorePacket = (SScorePacket*)packet;

            [scoreLabel setString:[NSString stringWithFormat:@"You: %d Challenger: %d", scoreDat.score, scorePacket->score]];

            break;
        }

        case kPacketTypeReady:
        {
            SReadyPacket* readyPacket = (SReadyPacket*)packet;

            rdyReceived = readyPacket->ready;

            if (rdyReceived == FALSE && scoreDat.mpRdy == TRUE) {
                [rdyLabel setString:@"Waiting for challenger..."];
            }

            if (rdyReceived == TRUE && scoreDat.mpRdy == FALSE) {
                [rdyLabel setString:@"Challenger is waiting... Ready?"];
            }

            if (rdyReceived == TRUE && scoreDat.mpRdy == TRUE) {
                [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.0 scene:[mpView node] withColor:ccWHITE]];
            }
            break;
        }

        default:
            CCLOG(@"received unknown packet type %i (size: %u)", packet->type, packet->size);
            break;
    }
}

【问题讨论】:

  • 使用 EXC_BAD_ACCESS 导致应用程序崩溃。
  • 您正在访问一个已被释放或不再在内存中的对象。请使用启用了 NSZombie 的工具来查找它是什么对象。

标签: iphone objective-c switch-statement case game-center


【解决方案1】:

你确定dataSReadyPacket* 吗? 它可能是nil 或其他类型。

【讨论】:

    【解决方案2】:

    您需要明确传入的数据到底是什么。您最初将其视为SPacketInfo,以获取类型。然后将其转换为其他两个结构之一,该结构包含 SPacketInfo,但绝对不是SPacketInfo 本身。然后,当您尝试访问所述结构的成员时,您将访问完全未定义的位置。

    packet 中的任何一个实际上都是一个数据包结构,在这种情况下,您应该将开关更改为:

    switch (packet->packetInfo->type)
    

    或者,它是SPacketInfo,在这种情况下,您需要以其他方式获取实际的“数据包”。

    【讨论】: