2011-05-13 4 views
0

내 모듈 중 하나에서 이벤트 기반 메커니즘을 유지 관리해야합니다. 논리는 : 이벤트가 수신되면EXEC_BAD_ACCESS를 제공하는 Mac OS X 프로그램

-(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에서 프로그램을 실행하면 노드가 이벤트 배열에 삽입되는 동안 오류가 발생합니다. 누구든지 디버그하는 방법을 내게 줄 수 있습니까? 모든 메모리 측면을 검사했지만 아무것도 찾지 못했습니다.

+0

'pEventArray'는 (는) 선언 된 속성입니까? 그렇다면 setter의 의미는 무엇입니까?'assign','copy','retain'? –

+0

그리고 CommEventData의 실제 선언은 무엇입니까? –

+0

그리고'EventData'의 실제 선언은 무엇입니까? –

답변

2

CommEventDataEventData과 같으면 Objective-C 클래스가 아닙니다. 따라서 NSMutableArray에 Objective-C 개체가 필요하므로 CommEventData * 유형의 값을 NSMutableArray에 추가 할 수 없습니다. 특히 -retain-release에 모두 응답하는 Objective-C 개체가 필요합니다. (NSObject *)에 관계없이 추가되는 내용이 객체가 아닌 경우 충돌이 발생합니다.

EventDataCommEventData을 Objective-C 클래스로 변환하면 NSMutableArray을 사용할 수 있습니다.

그렇지 않으면 Objective-C 개체가 아닌 값 (예 : structs의 포인터)에 대한 포인터를 저장하려면 NSPointerArray을 사용하는 것이 좋습니다. NSPointerArray은 임의의 (값에 대한 포인터) 값을 허용하기 때문에 요소의 소유권을 갖거나 요소를 릴리스하지 않습니다.

+0

그렇다면 i386 모드에서 충돌이 발생하지 않아야합니까? – Amitg2k12

+0

@Rohan 포인터 타입 ('CommEventData *')을 다른 포인터 타입 ('NSObject *')에 던지면 기본 값으로 변환되지 않습니다. 프로그램이 충돌할지 여부는 포인터가 가리키는 메모리 내용에 따라 달라 지므로 기본적으로 정의되지 않은 동작이 있습니다. –