2011-04-21 2 views
1

저는 Objective-C와 Cocoa에 아직 익숙하지 않지만 배우려고합니다. 간단한 ToDo 관리자를 만들고 있지만 EXC_BAD_ACCESS 크래시가 계속 발생하며 이유가 확실하지 않습니다. 충돌이 main.m 파일에서 발생합니다. "return NSApplicationMain (argc, (const char **) argv);" 그래서 정말 디버그하기가 어렵습니다.Objective-C & EXC_BAD_ACCESS

내 응용 프로그램 대리인의 실제 구현 파일은 다음과 같습니다. 어떻게됩니까

#import "ToDoAppDelegate.h" 
#import "Task.h" 

@implementation ToDoAppDelegate 

@synthesize textTaskName; 
@synthesize taskDate; 
@synthesize window; 
@synthesize newTaskWindow; 
@synthesize tableView; 
@synthesize arrayController; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    taskArray = [[NSMutableArray alloc] init]; 

    [taskArray retain]; 
} 

- (IBAction)addTaskClick:(id)sender 
{ 
    [NSApp beginSheet:newTaskWindow modalForWindow:window modalDelegate:self didEndSelector:NULL contextInfo:NULL]; 

    [taskDate setDateValue:[NSDate date]]; 
} 

- (IBAction)btnSaveClick:(id)sender 
{ 
    Task *newTask = [[Task alloc] init]; 

    [newTask setTaskName:[textTaskName stringValue]]; 
    [newTask setTaskDueDate:[taskDate dateValue]]; 

    [arrayController addObject:newTask]; 
    [newTask release]; 

    [textTaskName setStringValue:@""]; 

    [NSApp endSheet:newTaskWindow]; 
    [newTaskWindow orderOut:self]; 
} 

- (IBAction)btnCancelClick:(id)sender 
{ 
    [NSApp endSheet:newTaskWindow]; 
    [newTaskWindow orderOut:self]; 
} 

@end 

는 btnSaveClick의 메서드를 호출 할 때, 나는이 방법은 실행이 완료된 직후 EXC_BAD_ACCESS 충돌을 얻을 수있다.

(gdb) bt 
#0 0x00007fff851d212d in objc_msgSend() 
#1 0x00007fff80f9d1e6 in _CFAutoreleasePoolPop() 
#2 0x00007fff809a0fe0 in -[NSAutoreleasePool drain]() 
#3 0x00007fff8780451f in -[NSApplication run]() 
#4 0x00007fff877fd1a8 in NSApplicationMain() 
#5 0x0000000100001a82 in main (argc=1, argv=0x7fff5fbff638) at /Users/mattwise1985/Documents/Development/xCode Projects/ToDo/ToDo/main.m:13 

이 사람이 내가 잘못이 무엇인지 확인하기 위해 다운로드하고자하는 경우 난 상관 없어 그냥 테스트 프로젝트이기 때문에 : 여기

은 충돌에 대한 역 추적입니다. 여기에서 다운로드 할 수 있습니다. http://www.narfsoft.com/downloads/ToDo.zip

+2

충돌이 발생하면 GDB의 백 트레이스를 보여주십시오. –

+0

메인 포스트에 백 트레이스를 추가했습니다. – QuantumPhysGuy

답변

0

콘센트를 arrayController으로 설정했는데 nil이 아닌가?

taskArray = [[NSMutableArray alloc] init]; 

[taskArray retain]; 
당신은 명시 적으로 할당 후 유지로, 두번 배열을 해제해야합니다

...

조나단의 말처럼, GDB에서 역 추적은 다음과 같습니다 그런데

고맙습니다 ...

+0

콘센트 세트를 가지고 있는데 인터페이스 파일에 설정되어 있습니다 : @property (assign) IBOutlet NSArrayController * arrayController; – QuantumPhysGuy

4

NSZombie를 사용해보십시오. 대부분의 경우 개체가 릴리스 된 후에 메시지를 보내고 있습니다. 당신은 테이블 뷰 열에 대한 바인딩을 설정 한하지만 당신은 테이블 뷰 자체에 대한 바인딩을 설정하지 않았기 때문에

http://www.cocoadev.com/index.pl?NSZombieEnabled

+0

항상 신비한 메모리 관련 충돌에 대한 좋은 팁. ;) –

0

이 문제가 발생합니다.

MainMenu.xib에서 테이블보기를 선택하고 그 내용 (Table Content> Content)을 배열 컨트롤러 arrangedObjects에 바인딩하십시오. 그 동안 선택 색인 (표 내용> 선택 색인)을 배열 컨트롤러, 키 selectionIndexes에 바인드하십시오.

+0

그랬어! 감사! – QuantumPhysGuy

+0

글쎄, 내가 그랬다고 생각했다. 테스트를 더 마친 후에는 첫 번째 항목을 추가 할 때 작동합니다. 다른 항목을 추가하려고하면 EXC_BAD_ACCESS (으)로 다시 충돌합니다. – QuantumPhysGuy