2012-06-30 4 views
1

사라진 포인터가 있습니다 db; 값은 NSDocument 생성 중에 적절하게 설정되었지만 서브 윈도우를 열려고하는 순간에 값은 nil으로 변경되었습니다!nsdocument 서브 클래스 변수는 초기화 후에 nil로 재설정됩니다. 이유는 무엇입니까?

@interface MW_Document : NSDocument 
{ 
    MW_WorkerWindowController *workerController; 
    __strong MW_db *db; 
} 

- (IBAction)showWorkerManagementPanel:(id)sender; 
//- (IBAction)showSkillManagementPanel:(id)sender; 

구현이 포함되어 있습니다 :

- (void)windowControllerDidLoadNib:(NSWindowController *)aController 
{ 
    [super windowControllerDidLoadNib:aController]; 
    if (![self db]) { 
     db = [[MW_db alloc] init]; 
     NSLog (@"Debug - Init of db: [%ld]", db); // never mind the casting problem 
    } 
} 

데시벨에게 점을 무기 호 이외의 진정한 주소에서 나는 NSDocument 서브 클래스에 다음 있습니다.

- (IBAction)showWorkerManagementWindow:(id)sender 
{ 
    if (!workerController) { 
     workerController = [[MW_WorkerWindowController alloc] initWithDb:db]; 
    } 
    [workerController showWindow:self]; 
} 

내가 첫 번째 줄에 브레이크 포인트를 넣어 dB의 값을보고 :

은 나중에, 나는 창을 열고이이 같은 NSDocument 서브 클래스의 구현에 할. 그것은 아무 것도 아니지만, 아니오 아이디어가 있습니다. 아무도 나에게 이것을 설명 할 수 있습니까?

+1

당신이'windowControllerDidLoadNib에 중단 점을 설정하려고 있나요? 좀 더 구체적으로 말하면,'db = [[MW_db alloc] init];은 실제로 *'* workerController = [[MW_WorkerWindowController alloc] initWithDb : db]; 'workerController'가'- [showWindow :]'호출까지 NIB를로드하지 않을 수도 있습니다. – Stream

답변

2

당신은 게으른 접근 구현할 수 있습니다

- (MW_db *)db 
{ 
    if (db == nil) { 
     db = [[MW_db alloc] init]; 
    } 
    return db; 
} 

을 그리고 다음 바르 대신 사용 :`:

workerController = [[MW_WorkerWindowController alloc] initWithDb:[self db]]; 
+0

그런 lazy 접근자는 ivar 초기화에 대한 좋은 대안일까요? 내 생각 엔 성능에 좋지는 않지만 현재와 같은 문제를 디버깅하는 데 유용하다는 것입니다. 그 맞습니까? – markjs

+1

의존하지만 대부분의 경우 게으른 게터는'- [init]'에서 직접 ivar 초기화를하는 가장 좋은 대안입니다. 그리고 여러분이 실제로 객체를 필요로 할 때만 malloc 메모리가 있기 때문에 특히 성능이 좋습니다. 따라서 게으른 액세스를 제대로 구현하면 앱의 메모리 사용 공간이 가능한 작아집니다. – Stream

+0

값을 요청할 때마다 nil 검사는 어떻습니까? 이것은 매우 비싸지 만 위에 설명 된 메모리 관리 이점이 훨씬 더 중요합니다! 계산 상 비싼 nil-check이 얼마나 비싼 지에 대해 논평 할 수 있습니까? – markjs

관련 문제