2011-05-13 131 views
0

在我的一个模块中,我需要维护基于事件的机制。其中的逻辑是:当事件收到Mac OS X程序EXEC_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阵列时发生故障。任何人都可以给我一个线索如何调试?我检查了所有的内存方面,但没有找到任何东西。

+0

“pEventArray”是一个声明的属性吗?如果是这样,它的setter语义是什么:'assign','copy','retain'? – 2011-05-13 08:21:50

+0

什么是'CommEventData'的实际声明? – 2011-05-13 08:23:07

+0

什么是'EventData'的实际声明呢? – 2011-05-13 08:29:04

回答

2

如果CommEventDataEventData相同,那么它们都不是Objective-C类。因此,您不能将CommEventData *类型的值添加到NSMutableArray,因为NSMutableArray需要Objective-C对象 - 特别是对-retain-release都响应的Objective-C对象。如果添加的内容不是对象,则无论(NSObject *)类型转换如何,这都会崩溃。

如果将EventDataCommEventData转换为Objective-C类,则可以使用NSMutableArray。否则,如果要存储指向非Objective-C对象的值的指针(例如指向structs的指针),请考虑使用NSPointerArray来代替。请参见使用NSPointerArray。请注意,由于NSPointerArray允许任意(指向)值,因此它不会拥有或释放其元素。

+0

如果是这样,它不应该在i386模式下崩溃吗? – Amitg2k12 2011-05-13 11:01:42

+0

@Rohan如果您将指针类型('CommEventData *')转换为另一个指针类型('NSObject *'),则不会转换为基础值。程序是否会崩溃取决于指针指向的内存的内容,所以基本上你有未定义的行为。 – 2011-05-13 20:37:21