尝试打印结构变量时出错 - 目标C

时间:2011-05-31 11:34:53

标签: objective-c

-(BOOL)ChangeTimer:(unsigned short)wTimerIds withPeriod:(uint8_t)uPeriod
{
 stRs232Timer*   pEvent;
    NSLog(@"Into the changeTimer");
    NSLog(@"%d",wTimerIds);
    pEvent = (stRs232Timer*)[[m_cAppIdMap objectForKey:[NSNumber numberWithUnsignedShort:wTimerIds]]bytes];
    NSLog(@"bPersistent:%d",pEvent->bPersistent);
    NSLog(@"wAppTimerId:%d",pEvent->wAppTimerId);
    NSLog(@"uPeriod:%d",pEvent->uPeriod);
    NSLog(@"bStopped:%d",pEvent->bStopped);
    //NSLog(@"%@",pEvent);  
    if(pEvent!=nil){
        pEvent->bStopped = NO;
        pEvent->uPeriod = uPeriod;
        NSLog(@"completed");
    }   

    NSLog(@"The dict is:%@",m_cAppIdMap);

    NSLog(@"jsagxs:%@",m_cAppIdMap);
    return YES;
}

如果我删除上述代码中的注释,我会收到错误EXC_BAD_ACCESS。为什么会这样。

2 个答案:

答案 0 :(得分:3)

当您使用“%@”格式说明符时,您告诉运行时调用关联指针上的-descriptionWithLocale:-description方法,这些方法的类隐含为{{1的子类}}

结构不是Objective-C对象,因此没有NSObject-descriptionWithLocale:方法。 这是导致-description

的原因

您应该使用EXC_BAD_ACCESS打印出不指向Objective-C对象的指针。

答案 1 :(得分:1)

格式说明符%@通过期望NSObject子类,并调用descriptionWithLocale:description(如果descriptionWithLocale不存在)来获得NSString描述对象。 stRs232Timer只是一个C结构 - 而不是Objective C对象。当运行时尝试将其视为对象时,事情就会爆炸,正如您所看到的那样。

尝试使用%p说明符,它只打印项目的地址(即带有0x前缀的指针的值)。