Mac OS X程序提供EXC_BAD_ACCESS

时间:2011-05-13 08:18:08

标签: objective-c cocoa macos exc-bad-access

在我的一个模块中,我需要维护基于事件的机制。逻辑是:

发送活动:

-(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 个答案:

答案 0 :(得分:2)

如果CommEventDataEventData相同,则两者都不是Objective-C类。因此,您无法将CommEventData *类型的值添加到NSMutableArray,因为NSMutableArray需要一个Objective-C对象 - 特别是一个响应-retain的Objective-C对象}和-release。如果添加的内容不是(NSObject *)类型转换的对象,则会崩溃。

如果您将EventDataCommEventData转换为Objective-C类,则可以使用NSMutableArray

否则,如果要存储指向不是Objective-C对象的值的指针(例如指向structs的指针),请考虑使用NSPointerArray。请注意,由于NSPointerArray允许任意(指向)值,因此它不会拥有所有权,也不会释放其元素。