1

두 개체는 XCode 5.1 (및 CorePlot 1.4)을 사용하기 전에 NSNotifications을 수신하면 정상적으로 작동합니다. 그러나 XCode 5.1.1 (Coreplot 1.5)을 사용하면 메서드가 init 메서드 안에 있으면 실제로 등록되지 않는다는 것을 알았습니다.이 두 클래스는 다른 클래스의 부모 개체에서 작동합니다. 심지어 코드가 작동하는지 확인하기 위해 호출 전후에 NSLog을 넣습니다. 개체는 공유 부모가 강력하게 참조하며 부모는 문제없이 필요한 알림을받습니다. 그리고 NSLogdealloc에 있는데, removeObserver은 -it가 일찍 호출되지 않습니다. 객체는 적절하게 유지됩니다.NSNotificationCenter addObserver 무시됩니다

//The object is a CorePlot CPTGraphHostingView 
- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     //other code setting up a few private ivar primitive arrays and values 

     //this is where the call was (there are actually 3 Observer calls made) 
     [[NSNotificationCenter defaultCenter] 
     addObserver: self 
     selector: @selector(recordUpdated) 
     name: @"recordUpdated" 
     object: nil]; 

     //then this is called before the end 
     [self prepareGraph]; 

     //this is where I moved it 
     [self startListening]; 
    } 
    return self; 
} 

다시 말하지만, 아무것도 내가 마지막으로 엑스 코드 5.1 (및 CorePlot 1.4)로 컴파일 이후 통지 또는이 두 클래스를 보내는 객체의 코드에 대한 변경되었습니다. 그리고이 같은 호출은 부모의 init에서 사용되고 완벽하게 작동합니다. 어젯밤 유일한 해결책은 addObserver 호출을 새 메서드로 리팩토링하고 init 끝에서 해당 메서드를 호출하는 것이 었습니다.

그러나 이것이 필요한 이유를 이해할 수 없습니다. 누구든지 중간에 배치 된 이유는 "무시"될 것이라고 생각할 수 있습니까? 그러나 init에 의해 호출되는 다른 메서드가 작동하면 작동합니까?

편집 및 메모 :

나는 초기화를 보여주기 위해 더 많은 코드를 추가했습니다. 또한 CorePlot에 대한 그래프보기라는 메모를 추가했으며 CorePlot도 최근 문제 1.5의 소스 코드가 될 수 있습니다 (잊어 버렸습니다).

lead_the_zeppelin의 제안이 재 할당되고있는 것 같습니다. 하지만 NSNotificationCenter에서 -now-dealloc 된 객체에 대한 호출이 프로그램을 중단시키지 않을 것입니다 (dealloc은 호출되지 않습니다. - NSLog이 있습니다)? 나는이 객체 인스턴스 문자열을 init 내부에 출력함으로써 쉽게 테스트 할 수 있습니다. 지난 밤에 인스턴스를 묻는 테스트를했는데 그 비트를 init에 복사했다고 생각하지 않습니다.

+1

init 메소드에서 발생하는 다른 일과 관련이있는 것 같습니다. 아마도 게시를 통해 도움을받을 수 있습니까? –

+0

완료. 그렇게함으로써 최근에 CorePlot을 업데이트 한 것을 알게되었습니다. –

+0

그냥 'recordUpdated' 메쏘드에'NSLog' (또는 breakpoint)를 가지고 있습니다. (나는 그것이 명백하게 들리 겠지만, 그렇게 쉽게 끝났음을 안다.) – Rich

답변

1

코어 플롯 호스팅보기는 호스트 된 그래프 또는 collapsesLayers 속성을 설정할 때마다 모든 알림의 옵저버로서 자체를 제거합니다. 문제를 해결하려면 issue tracker에 버그 보고서를 게시하십시오.

그 동안 그래프를 설정 한 후 옵서버를 추가하십시오.

+0

나는 CorePlot 소스를 통해 걸어 다닐 생각을하지 못했습니다. 그러나 그렇습니다. updateNotifications 메소드 아래에 있습니다. 나는 또한'dealloc'도 이미'removeObserver'를 호출하고 있음을 알았다. 나는 그것을 호출하는 두 가지 메소드 인 setHostedGraph와 setCollapsesLayers를 볼 수있다. 그래프 구조가 수정 될 때마다 정기적으로'addObserver'를 다시 할 필요없이 어떻게 CPTGraphHostingView를 서브 클래스화할 수 있는지 궁금해하기 때문에 버그로 게시 할 것입니다. –

0

알림 센터에 가입하면 자체가 다시 할당 될 수 있습니다. viewDidLoad에 - 당신은 아마에

-(void)awakeFromNib 
{ 
    [[NSNotificationCenter defaultCenter]addObserver: self selector:@selector(recordUpdated) name:@"recordUpdated" object:nil]; 
} 

나에 코드를 이동할 수 있습니까?

+0

추가 코드와 메모를 추가했습니다. 이들은 UIView가 아니기 때문에 Nibs에서 깨어나지 않습니다. –

+0

@ Adam -prepareGraph의 기능은 무엇입니까? –

+0

핵심 플롯 호스팅보기는 UIView의 하위 클래스입니다. 따라서 하위 클래스도 있습니다. –

관련 문제