-(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。为什么会这样。
答案 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
前缀的指针的值)。