2016-09-23 5 views
1

이 완료 블록이 올바르게 호출되는 이유는 무엇입니까?이 완료 블록이 올바르게 호출되는 이유는 무엇입니까?

CompletionBlock comp = ^(BOOL enabled) { 
      //enabled is being correctly set 
      NSLog(@"result: %i", enabled); 
}; 

@autoreleasepool { 
    Monitor *monitor = [[Monitor alloc]initWithCompletionBlock:comp]; 
    monitor = nil; 
} 

모니터는 모니터가 인스턴스화 된 후 10 초 후에 완료 블록을 호출하기 위해 NSTimer를 시작합니다.

모니터에는 내부적으로 (@property (nonatomic) CompletionBlock compblock;을 통해) 참조가 있지만 순환 참조의 구성 요소는 모니터를 참조하는 것이 없으므로 나타나지 않습니다.

정상적인 동작입니까? 그리고 내가 의지 할 수있는 행동인가? 그것은 정말로 나에게 이해가 가지 않는다.

+0

Monitor 클래스의 구현을 보지 않아도 실제로 적절한 대답을 줄 수는 없습니다. – rmaddy

답변

2

아마도 여기서는 Monitor 인스턴스가 대상입니다. NSTimer은 해제 될 때 할당 취소 된 객체를 메시징하여 발생하는 크래시를 피하기 위해 대상을 유지합니다. * 현재 실행 루프는 예약 된 타이머를 유지합니다.

이것은 정상적인 행동, you can rely on it이다

대상
메시지를 보내는 데에 목적 [...] 타이머 ... target 강한 참조를 유지

실제로 타이머와 대상 사이에주기를 유지할 수 있도록 고려해야합니다.


* NSTimer 오랜 시간 약한 참조를 nilling 자동 선행한다.

+0

정확합니다. 모니터 개체가 대상입니다. 나는 또한 반복을 사용하고있다 : 아니오. 설명서는 타이머가 작동하면 무효화 될 것이라고 말합니다. 선택기가 완료된 후 그 의미를 짐작할 수 있습니까? 그렇지 않으면 GC가 너무 빨리 할 수있는 가능성이 있습니다. – user3564870

+1

예, 타이머가 셀렉터를 수행하기 위해 대상을 알릴 때까지 타이머가 무효화되지 않습니다. –

관련 문제