2012-11-04 1 views
0

잘 모르겠습니다.이 권한을 묻지 만 어쨌든 시도해 보겠습니다.개체 할당 해제 중 개체의 관찰자 등록 해제

나는이 코드 조금 호출하는 프로그램 ... 결국 사라지고 나는 코드의 현재 비트를 removeObserver 싶습니다 localCalculateTimeFiles

[localCalculateTimeFiles addObserver:self 
     forKeyPath:@"arraystatuscounter" 
      options:NSKeyValueObservingOptionNew 
      context:NULL]; 

이 (조잡를 넣어). 아무 것도하지 않고 localCalculateTimesFiles가 적절한 removeObserver를 수행하지 않고 사라지는 경우 런타임에서 예외가 발생합니다. 나는 더 많은 경고가 있었지만 지금은 프로그램이 이상하다고 생각합니다.

개체 포인터를 모두 적절한 시간에 적절한 위치에 올바르게 가져옵니다. 내가하고 싶은 건 localCalculateTimeFiles가 할당 해제 될 때 관중을 내려 놓는다. 나는 새와 LOG_FILE를 처리하기위한 논리를 대체 할 것

- (void)finalize { 
    if (log_file != NULL) { 
     fclose(log_file); 
     log_file = NULL; 
    } 
    [super finalize]; 
} 

애플의 문서에 따르면, 나는이 일을하기 위해 다음과 같습니다 localCalculateTimeFiles에 메서드를 추가 할 것으로 보인다

... 관찰자 등록을 취소하는 논리 분명히, removeObserver 메소드가 제대로 작동 할 수있는 아이템을 가지고 있는지 확인하기 위해 모든 포인터를 가지고 있는지 확인해야합니다. 내가 제대로 그걸 줘,이게 합리적 이냐, 아니면 완전히 벗어난거야?

답변

4

finalize가 올바른 위치라고 생각하지 않습니다.

관측을 등록 취소하는 가장 좋은 방법은 객체가 삭제되기 바로 전에 호출되는 dealloc 방법입니다.

+0

+1 '-finalize'는 a) 가비지 수집기에서만 호출되며, b)이 시점에서 가비지 수집 대신 ARC를 사용해야하므로 b) 사용되지 않습니다. – Caleb

+0

좋아, 그래서 대신 dealloc 메서드를 다시 실행해야한다. 이번 주에 시험해보고 작동시킨 후에 투표 버튼을 눌러 보겠습니다. –