在我的一个模块中,我需要维护基于事件的机制。逻辑是:
发送活动:
-(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 :(得分:2)
如果CommEventData
与EventData
相同,则两者都不是Objective-C类。因此,您无法将CommEventData *
类型的值添加到NSMutableArray
,因为NSMutableArray
需要一个Objective-C对象 - 特别是一个响应-retain
的Objective-C对象}和-release
。如果添加的内容不是(NSObject *)
类型转换的对象,则会崩溃。
如果您将EventData
和CommEventData
转换为Objective-C类,则可以使用NSMutableArray
。
否则,如果要存储指向不是Objective-C对象的值的指针(例如指向structs
的指针),请考虑使用NSPointerArray
。请注意,由于NSPointerArray
允许任意(指向)值,因此它不会拥有所有权,也不会释放其元素。