Ошибка при попытке печати структурной переменной-Objective C - PullRequest
0 голосов
/ 31 мая 2011
-(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 ]

3 голосов
/ 31 мая 2011

Когда вы используете спецификатор формата "% @", вы указываете среде выполнения вызывать методы -descriptionWithLocale: или -description для связанного указателя, класс которого подразумевается как подкласс NSObject.

Структуры не являются объектами Objective C и поэтому не имеют метода -descriptionWithLocale: или -description. Это то, что вызывает EXC_BAD_ACCESS.

Вы должны использовать %p для распечатки указателей, которые не указывают на объекты Objective-C.

1 голос
/ 31 мая 2011

Спецификатор формата% @ работает, ожидая подкласс NSObject и вызывая descriptionWithLocale: или description (если descriptionWithLocale отсутствует), чтобы получить NSString, описывающий объект.stRs232Timer - это просто структура C, а не объект Objective C.Когда среда выполнения пытается рассматривать его как объект, вещи взрываются, как вы видите.

Вместо этого попробуйте спецификатор %p, который просто напечатает адрес элемента (то есть значение указателяс префиксом 0x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...