ARC, NSNotificationCenter 및 블록과 관련된 홀수 인 경우가 있습니다. 다음은 코드의 간단한 예입니다. 테스트 결과, didSaveObserver
의 메모리 관리가 원하는대로 수행되고있는 것으로 보입니다. 즉, 유지 사이클을 생성하지 않고 removeObserver:
전에 nil
이 작성되지 않았습니다.약하게 할당 된 변수가 유지 사이클을 생성하지 않고 dealloc으로 처리되지 않도록합니다.
그러나 ARC에 대한 나의 이해는이 것이 우연/우화 일 뿐이며 ARC는 didSaveObserver
전에 removeObserver:
앞에 올 수 있다고 생각하게 만듭니다. didSaveObserver
이 표시되지 않는 경우 (유일한 할당은 weak
변수에 해당), 그러면 ARC가 즉시이를 할당 해제 할 수 있습니다 (해야합니까?).
ARC 규칙을 올바르게 이해 했습니까? 그렇다면 didSaveObserver
이 보이지 않도록 할 수 있지만 유지주기를 만들지 않도록하려면 어떻게해야합니까?
self.willSaveObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextWillSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
id preSaveState = ...; //Store some interesting state about a Core Data object (the details aren't significant to this question).
__weak __block id didSaveObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
//Unobserve the did save block. This is the tricky bit! didSaveObserver must be __weak to avoid a retain cycle, but doing so also means that the block may be dealloced before it can be unobsered.
[[NSNotificationCenter defaultCenter] removeObserver:didSaveObserver];
id postSaveState = ...;
//Perform work that uses pre & post save states.
}];
}];
자세한 내용 :
__weak
경우는 추가되지 않습니다 (그래서 기본값 __strong
에) Instruments는이주기를 유지하기가 있음을보고합니다. 물론
// The return value is retained by the system, and should be held onto by the caller in
// order to remove the observer with removeObserver: later, to stop observation.
이 특정한 경우를 설명하는 것이, :
인스 트루먼 트가 말하기 때문에 그것이 유지 사이클을 생성한다고 생각합니다. 질문을 업데이트했습니다. –