2012-08-05 3 views
2

메뉴 항목을 클릭하면 NSTableView가 포함 된 간단한 응용 프로그램을 개발하려고합니다. 문제는 NSTableView가 데이터를 표시 한 직후에 앱이 충돌한다는 것입니다. 전체 스택 추적 : 나는 ARC를 사용하고 있기 때문에코코아, 컨트롤러 인스턴스화 및 충돌

* thread #1: tid = 0x2107, 0x00007fff943bce90 libobjc.A.dylib\`objc_msgSend + 16, 
      stop reason = EXC_BAD_ACCESS (code=13, address=0x0) 
    frame #0: 0x00007fff943bce90 libobjc.A.dylib`objc_msgSend + 16 

, 내가 어떤 참조 카운팅 문제를 제외해야합니다; 하지만 어쩌면 내가 나쁜 방법으로 컨트롤러를 (창을 만드는 데 필요한) 만들고있어, 그것은 실수로 free'd되고있어.

- (IBAction)showPreferences:(id)sender { 
    if(!preferencesWindow) { 
     preferencesWindow = [[[PreferencesWindowController alloc] 
          initWithWindowNibName:@"PreferencesWindow"] window]; 
    } 

    [preferencesWindow makeKeyAndOrderFront:sender]; 
} 

PreferencesWindowController이 코드합니다 (NSTableView는 필요한) 데이터 소스 프로토콜을 구현

만들고 창을 표시 AppController가의 코드이다.

- (int)numberOfRowsInTableView:(NSTableView *)tabView { 
    return 1; 
} 

- (id)tableView:(NSTableView *)tabView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row { 
    NSString *val = [NSString stringWithFormat:@"%@[%d]", [tableColumn identifier], row]; 
    return val; 
} 

크래시 그 자체가 원인이 아닙니다. 그러나 NSTableView의 dataSource에서 PreferencesWindowController를 제거하면 충돌이 발생하지 않으므로 다소 관련이 있습니다.

어디서 실수입니까?

편집 :

screenshot of Instruments

을 어쨌든, 스택 I 쓴 코드 밖에 : 좀비 프리셋과 프로파일 (인스트루먼트)를 사용하여, I는 그 기준 카운터 네거티브 진행 객체가있을 알 수있다. 나는 거기에 중단 점을 둘 수 없다. 그리고 나는 두 번 공개되는 대상이 무엇인지를 볼 수 없다. (또는 내가 어떻게 해야할지 모르겠다.)

답변

1

는 참조하는 동안 의심스러운 것으로 보입니다. 윈도우 자체가 강력한 참조를 가지고 있는데, ARC가 PreferencesWindowController을 릴리스하는 것처럼 보입니다.

PreferencesWindowController 개체를 변수/속성 strong에 저장하고 알려주세요.

+0

감사합니다. 그게 문제였습니다! 나는 (윈도우 컨트롤러, 실제로) 읽기 전용 게으른 로딩 속성에 넣었다. – fferri

+0

@mescalinum 굉장! 다행이 당신을 위해 일 했어. – Vervious

관련 문제