Программа для Mac OS X, предоставляющая EXEC_BAD_ACCESS - PullRequest
0 голосов
/ 13 мая 2011

В одном из моих модулей мне нужно поддерживать механизм на основе событий.Логика:

Чтобы отправить событие:

-(void)addEvent:(EventData *)pData{

    [self enQueueEvent:pData];

    [[NSNotificationCenter defaultCenter]
     postNotificationName:EVENT_NAME
     object:nil ];

}

-(void)enQueueEvent:(EventData *)pData{
    [pEventLock lock];
    [self.pEventArray insertObject:(NSObject *)pData atIndex:0];
    [pEventLock unlock];
}

Когда событие получено:

-(void)EventHandler: (NSNotification *) notification
{
    [self log:@"event Handled"];
    EventData *pData = [self deQueueEvent];

    if(pData){
        switch(pData->eModuleId){
            case UI_EVENT:{
                [UIController HandleUICallBack:(EventType)pData->eType LParam:pData->lParam WParam:pData->wParam];
            }
        }
        pData->lParam = 0x00;
        pData->wParam = 0x00;
        free(pData);
    //  [pData release];
        //[self removeProcessedEvent];  
    }
}

-(EventData *)deQueueEvent{
    [pEventLock lock];
    NSObject *pData = [self.pEventArray lastObject];
    [self.pEventArray removeLastObject];
    [pEventLock unlock];
    return (EventData *)pData;
}


>>>>>>> Adding Header File Declaration >>>>>>>>>>>>>>>>>>>
typedef struct __eventData{
    ModuleId eModuleId;
    EventType eType;
    void *lParam;
    void *wParam;

}EventData;

@interface CommEventHandler : NSObject {
    NSMutableArray *pEventArray;
    bool shouldStartTimer;
    int timerValue;
    NSLock  *pEventLock;
}

@property(nonatomic,retain)NSMutableArray *pEventArray;
@property(nonatomic,retain)NSLock  *pEventLock;

<<<<<<<<<<<<<<<< End of Header File <<<<<<<<<<<<

Я считаю, что это легко понять.Теперь происходит то, что, когда я запускаю программу в 10.6 | App Name | Debug | i386, она работает отлично, но когда я запускаю программу в 10.6 | App Name | Debug | X86_64, происходит сбой при вставке узла в массив Event.Может кто-нибудь дать мне подсказку, как отлаживать?Я проверил все аспекты памяти, но ничего не смог найти.

1 Ответ

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

Если CommEventData совпадает с EventData, то оба класса не являются Objective-C. Таким образом, вы не можете добавлять значения типа CommEventData * к NSMutableArray, потому что NSMutableArray ожидает объект Objective-C - в частности, объект Objective-C, который отвечает как -retain, так и -release. Это приведет к сбою, если добавляемый объект не является объектом независимо от типа (NSObject *).

Если вы преобразуете EventData и CommEventData в классы Objective-C, вы можете использовать NSMutableArray.

В противном случае, если вы хотите сохранить указатели на значения, которые не являются объектами Objective-C (например, указатели на structs), рассмотрите возможность использования NSPointerArray. Обратите внимание: поскольку NSPointerArray допускает произвольные (указатели) значения, он не принимает и не освобождает свои элементы.

...