0

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. 

이 특정한 경우를 설명하는 것이, :

답변

0

didSaveObserver이 특별한 경우에 dealloced되지 않는 이유를 설명 NSNotification.h의 댓글이 있습니다.

0

먼저, 왜 그것이주기를 유지한다고 생각합니까? 블록은 didSaveObserver을 유지합니다 (예). didSaveObserver 블록을 유지합니까? 추가 된 관찰을 제거하기 위해 removeObserver:에서 사용할 수있는 것 이외에는 반환 된 관찰자 객체에 대해 아무 것도 기록되어 있지 않습니다. 그것은 어떻게 든 블록을 유지하거나 블록 자체 일 수 있으며,이 경우 유지 사이클을 생성 할 수 있습니다. 안전하고 싶다면 weak을 사용하여 블록의 관찰자를 나타낼 수 있습니다. didSaveObserver이 유지되지 않습니다으로 (만 할당 약한 변수입니다)보고

후 ARC는 수/(해야합니까?) 그것을 즉시 할당 해제.

반송하기 전에 알림 센터에 보관하지 않는 한.

+0

인스 트루먼 트가 말하기 때문에 그것이 유지 사이클을 생성한다고 생각합니다. 질문을 업데이트했습니다. –