получить значение из словаря - PullRequest
0 голосов
/ 26 мая 2011
stRs232Timer* pEvent;
pEvent = (stRs232Timer*)[m_cAppIdMap objectForKey:[NSNumber numberWithUnsignedShort:wTimerIds]];

Я получаю ошибку EXC_BAD_ACCESS. Почему это так?

РЕДАКТИРОВАНИЕ:

-(BOOL)createTimer
{
    stRs232Timer*   pEvent = malloc(sizeof(stRs232Timer));

    pEvent->bPersistent = YES;                              // setup timer structure
    //pEvent->pStack      = pStack;
    pEvent->wAppTimerId = 95;
    pEvent->uPeriod     = 50;
    pEvent->bStopped    = NO;
    pEvent->uExpirationTime = 10;

    NSLog(@"bPersistent:%d",pEvent->bPersistent);
    NSLog(@"wAppTimerId:%d",pEvent->wAppTimerId);
    NSLog(@"uPeriod:%d",pEvent->uPeriod);
    NSLog(@"bStopped:%d",pEvent->bStopped);


    NSData* myData = [NSData dataWithBytes:(void*)pEvent length:sizeof(stRs232Timer*)];

    wTimerId = 99;
    pEvent->uPeriod = 51;
    myData = [NSData dataWithBytes:(void*)pEvent length:sizeof(stRs232Timer*)];
    [m_cAppIdMap setObject:myData forKey:[NSNumber numberWithUnsignedShort:wTimerId]];
    wTimerId = 96;
    pEvent->uPeriod = 52;
    myData = [NSData dataWithBytes:(void*)pEvent length:sizeof(stRs232Timer*)];
    [m_cAppIdMap setObject:myData forKey:[NSNumber numberWithUnsignedShort:wTimerId]];
    wTimerId = 97;
    pEvent->uPeriod = 53;
    myData = [NSData dataWithBytes:(void*)pEvent length:sizeof(stRs232Timer*)];
    [m_cAppIdMap setObject:myData forKey:[NSNumber numberWithUnsignedShort:wTimerId]];
    wTimerId = 98;
    pEvent->uPeriod = 54;
    myData = [NSData dataWithBytes:(void*)pEvent length:sizeof(stRs232Timer*)];
    [m_cAppIdMap setObject:myData forKey:[NSNumber numberWithUnsignedShort:wTimerId]];
    wTimerId = 95;
    pEvent->uPeriod = 55;
    myData = [NSData dataWithBytes:(void*)pEvent length:sizeof(stRs232Timer*)];
    [m_cAppIdMap setObject:myData forKey:[NSNumber numberWithUnsignedShort:wTimerId]];

    NSLog(@"The dictionary count now is:%d",[m_cAppIdMap count]);
    NSLog(@"The dictionary values now is:");
    NSLog(@"%@",m_cAppIdMap);


    [m_cPendingEventList addObject:myData];
    NSLog(@"EventList:%@",m_cPendingEventList);

    [self StopTimer:99];

return YES;
}

-(BOOL)StopTimer:(unsigned short)wTimerIds
{
    NSLog(@"Into the StopTimer!!");
    stRs232Timer* pEvent;
    BOOL bReturn = NO;
    pEvent = (stRs232Timer*)[m_cAppIdMap objectForKey:[NSNumber numberWithUnsignedShort:wTimerIds]];

    if ([theLock tryLock]) {
        int cnts = [m_cAppIdMap count];
        NSLog(@"The count is:%d",cnts);
           if(pEvent!=nil)
            {
                pEvent->bStopped = YES;
                [m_cAppIdMap removeObjectForKey:[NSNumber numberWithUnsignedShort:wTimerIds]];
                bReturn = YES;
            }
    }
    NSLog(@"My Dictionary value now is:%@",m_cAppIdMap);
    [theLock unlock];
    return bReturn;
}

Я отладил код, чтобы увидеть, где он вызывает это исключение. [M_cAppIdMap removeObjectForKey: [NSNumber numberWithUnsignedShort: wTimerIds]]; внутри stopTimer.It выходит.

stRs232Timer - указатель на структуру, которая хранится в NSDictionary как объект NSO с помощью NSData.

Ответы [ 2 ]

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

Вы уверены, что это тот код, который дает сбой? Если wTimerIds является коротким без знака, то словарь вернет nil, если ключ не существует. Даже если словарь не определен, отправка сообщения объекту nil действительна и не приведет к сбою.

Поэтому я думаю, что либо: 1. Авария в другом месте 2. wTimerIds не является неподписанным коротким

2 голосов
/ 26 мая 2011

m_cAppIdMap возможно, был выпущен преждевременно. Вы можете запустить Profiler (использовать инструмент Zombies), и в этом случае вы получите сообщение о том, что сообщение было отправлено освобожденному объекту, когда он пытается вызвать objectForKey

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