두 개체는 XCode 5.1 (및 CorePlot 1.4)을 사용하기 전에 NSNotifications
을 수신하면 정상적으로 작동합니다. 그러나 XCode 5.1.1 (Coreplot 1.5)을 사용하면 메서드가 init
메서드 안에 있으면 실제로 등록되지 않는다는 것을 알았습니다.이 두 클래스는 다른 클래스의 부모 개체에서 작동합니다. 심지어 코드가 작동하는지 확인하기 위해 호출 전후에 NSLog
을 넣습니다. 개체는 공유 부모가 강력하게 참조하며 부모는 문제없이 필요한 알림을받습니다. 그리고 NSLog
이 dealloc
에 있는데, 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
에 복사했다고 생각하지 않습니다.
init 메소드에서 발생하는 다른 일과 관련이있는 것 같습니다. 아마도 게시를 통해 도움을받을 수 있습니까? –
완료. 그렇게함으로써 최근에 CorePlot을 업데이트 한 것을 알게되었습니다. –
그냥 'recordUpdated' 메쏘드에'NSLog' (또는 breakpoint)를 가지고 있습니다. (나는 그것이 명백하게 들리 겠지만, 그렇게 쉽게 끝났음을 안다.) – Rich