1

NSWindowController에서 이상한 상황이 발생합니다. 윈도우 컨트롤러를 공개하고 싶지만 그렇지는 않습니다. ARC 동작에 대한 제 기대치를 따르지 않는 것 같습니다.NSWindowController 하위 클래스가 ARC에서 해제되지 않습니다.

간단한 윈도우 컨트롤러 하위 클래스 인 PlainWindowController를 만들었습니다. 그것의 인터페이스와 구현은 비어 :

#import <Cocoa/Cocoa.h> 

@interface PlainWindowController : NSWindowController 
@end 

@implementation PlainWindowController 
@end 

내가 그것으로 이미 설정 위임 및 windowController 연결과 창문이 windowController가 PlainWindowController.xib 이름 XIB 기본을 만들었습니다. 이 테스트 실행이 약한 참조가 전무없는 경우

PlainWindowController *strongWindowController = [[PlainWindowController alloc] initWithWindowNibName:@"PlainWindowController"]; 
__weak PlainWindowController *weakWindowController = strongWindowController; 

[strongWindowController showWindow:nil]; 

strongWindowController = nil; 
STAssertNil(weakWindowController, @"The window controller should have been deleted, wasn't"); 

:

테스트에서이 코드를 작성했습니다.

showWindow을 생략하면 0이됩니다. initWithWindowNibName 대신 init을 사용하면 nil입니다.

여기에 무슨 일이 일어나는 지 아는 사람이 있습니까? 사전 안내에 감사드립니다.

답변

2

일반적으로 제어하지 않는 다른 코드로 객체를 전달한 경우 객체 할당을 해제 할 때 "기대치"가 있어야합니다.

코코아가 컨트롤러를 유지 한 후 자동으로 리콜했을 수 있습니다. Cocoa는 보여주고있는 모든 윈도우의 윈도우 컨트롤러를 보유 할 수 있습니다.

일반적으로 코코아 메모리 관리에 관해서는 자신의 코드가 규칙 (ARC는 주로 사용자를위한 것임)을 준수해야하며 다른 코드가 규칙을 따른다고 가정해야하지만 ' 다른 코드가 관심사가 끝나는 곳 이상의 오브젝트를 보유하지 않는다고 가정하지 마십시오. 기본적으로 다른 코드가 메모리 관리와 관련하여 무엇을하는지 신경 쓰지 않아야합니다.

실제 상황을 알고 싶다면 Allocations 도구 아래에서 앱을 실행하고 개체 할당/해제/자동 릴리스 내역을 탐색 한 다음 해당 개체의 할당이 취소 된 것으로 예상되는 지점 이후를 살펴보십시오.

+0

설명해 주셔서 감사합니다. 사실, 아무런 강력한 참조없이 일반 응용 프로그램에서 펜촉을 어딘가에 초기화하면 알 수없는 시간에, 그러나 신속하게 dealloc을 수행합니다. ARC에 의해 제공되는 새로운 컨트롤이 여전히 오토 레이스 뒤에서 숨겨져 있다는 것은 너무 나쁩니다. – stevel

3

ARC에있는 오브젝트가 자동 해제 풀에 추가되지 않았다고 보장 할 수 없습니다.이 경우 현재 이벤트가 끝날 때까지 해제되지 않습니다.

귀하의 경우, 나는 컨트롤러가 유지되고 자동 릴리즈되는 것을 initWithWindowNibName: 어딘가에서 의심합니다.

개체가 해제되었는지 확인하려면 -dealloc 메서드를 하위 클래스로 만들고 NSLog를 추가하거나 중단하십시오.

+0

감사합니다. initWithWindowNibName 어딘가에 retain/autorelease가 있어야합니다. 불행히도 보관주기 (이 문제를 조사한 원래의 이유)의 경우 dealloc은 물론 호출되지 않습니다. 이제는 이러한 간단한 단위 테스트를 사용하여 유지주기를 테스트 할 수 없다는 것을 알게되었습니다. 다른 방법을 사용할 것입니다 ... – stevel

0

ARC를 처음 사용했을 때 비슷한 문제가있었습니다. 불행히도 이것은 1 년이 넘었으므로 세부 사항을 기억하지 못합니다. 머리카락을 많이 잃지 않고 유지 값을 모니터링하기 위해 Instruments를 사용하여 순환 유지 문제로 추적했습니다. NSWindowController 서브 클래스가 할당을 해제하지 않을 않으며, -dealloc 불을했다 -

나는 실제 문제는 내가 @property (unsafe_unretained) id delegate; 내가 ARC 기반 프로젝트 어제 유사한 문제로 실행

+0

대리자는 실제로 유지주기를 발생시키는 일반적인 장소입니다. 다른 하나는 객체를 타겟팅하는 타이머가있는 객체입니다 (타이머는 대상 객체를 보유하므로 창 컨트롤러가 자체적으로 타겟팅하는 타이머를 가지고 있으면주기 유지). 새로운 것을 매일 배우십시오 :) – stevel

0

고정 대리자로 생각. 나는 좀비와 일했는데, 할당은 아무 소용이 없다. 문제는 매우 간단했습니다.거기 윈도우 내의 서브 클래 싱 제어이고, 그 서브 클래스 .H 헤더 파일 제어의 속성은 다음과 같이 정의 하였다 :이 문제를 해결

@property (nonatomic, weak) id delegate; 

로 보정

@property id delegate; 

.