0

어딘가에 내 코드에서 기본 창에서 여러 개의 창을 만들어야합니다. 각각의 창은 특정 구성으로 작동하지만 동일한 컨트롤러 개체의 모든 인스턴스로 작동합니다.사전을 이용한 메모리 관리/GCC의 오해 가능성?

열려있는 창 목록을 유지해야하기 때문에 창을 열 때마다 해당 인스턴스가 사전에 저장되고 창이 닫히면 주 창에 알림이 전송되어 그 창을 제거합니다 사전에서 특정 창.

컨트롤러 개체의 인스턴스를 만든 다음 [showWindow : self]를 호출하여 창을 만듭니다. 그런 다음 사전에 창을 저장하고 메서드를 종료합니다.

제 문제는 새로 생성 된 객체를 공개하거나 자동 리 레이스하지 않기 때문에 윈도우가 사전에서 제거 될 때 수행해야합니다 (맞습니까?). 사전에 객체를 놓았을 때 그 객체를 릴리즈하거나 자동으로 릴리즈하면, 객체를 제거하려고 할 때 모든 종류의 에러가 발생합니다.

1) Xcode에서 인스턴스가 사전에 저장되는 것을 알지 못하는 간단한 버그 일 수 있습니까?

2) 어쨌든 사전에서 참조를 저장하고있는 경우 왜 자동 복구가 내 창을 파괴합니까?

CHPostgreSQLMainController *pgMainController = [[CHPostgreSQLMainController alloc]initWithConnectionSettings:(CHPostgreSQLSettingsModel *)entityFromArray error:&error]; 

// Only display the window if the connection was successful. 
if (pgMainController) { 
    [pgMainController showWindow:self]; 

    // Register the window we've opened on the list of open windows 
    [listOpenWindows setObject:pgMainController forKey:[entityFromArray connectionName]]; 
} else { 
    //call NSAlert 
} 
+0

"컨트롤러 개체의 인스턴스를 만들어 창을 만듭니다 ..."이 NSWindowController에 대한 이야기입니까? 그렇다면 무엇을하고 있습니까? –

+0

창을 표시하고 컨트롤러에 대한 참조를 사전에 저장합니다. – ruipacheco

답변

1

1) 아래

[업데이트] 코드이 사전에 저장 되는 인스턴스를 통지하지 않습니다 엑스 코드 에서 간단한 버그가 될 수 있을까?

아니요. 유지, 릴리스 및 자동 재활용은 코드를 작성하여 발생하기 때문에 발생합니다. Xcode는 코드에 이러한 동작을 삽입하지 않습니다.

이제 정적 분석기의 버그 일 수 있습니다. 더 많은 코드를 게시하십시오.

2) 어쨌든, 왜 사전 가에 대한 참조를 저장하는 경우 , 내 창을 파괴 autorelease를합니까?

보유를 릴리스 또는 자동 출시와 균형을 유지해야 할 정도로 창을 유지 했습니까?

그렇지 않으면 창을 너무 많이 놓습니다.

정적 분석기 (빌드 & 분석)를 실행하고 식별 된 문제를 해결하십시오.

어떤 경우에도 +alloc 창이 표시되지 않았고이 창을 -retain 창에 표시하지 않았다면 해제하지 않아야합니다.

+0

죄송합니다. 죄송합니다. Xcode의 버그로 인해, 정적 분석기가 내 코드를 실제 메모리가 아닌 실제 메모리가 아닌 것으로 표시하여 두 가지로 남겨 둡니다. Xcode에서 경고를 무시하면 코드가 실행됩니다. . 내가 그것을 고치지 않으면 고쳐지지 않을 것입니다. – ruipacheco

+0

아 ... 네. 확실히 정적 분석기의 버그 일 수 있습니다. 코드를 게시하면 더 나은 분석을 할 수 있습니다. – bbum

0

창의 "닫을 때 놓기"설정이 해제되어 있는지 (또는 보완 중인지) 확인하십시오. 켜져 있으면 사용자가 닫을 때 스스로 해제됩니다.

+0

닫을 때 토글 해제가 효과가없는 것처럼 보였으 나 이전과 똑같이 문제가 반복됩니다. – ruipacheco

+0

이것이 합법적 인 확실한 해결책이었던 이유는 확실하지 않습니다. –

0

listOpenWindows (실제로는 Of이어야 함)이 nil이 아닌지 확인하십시오. 아마도 당신은 그것을 창조하는 것을 잊었거나 아직 그것을 창조하지 않았다.