2016-11-01 9 views
3

는, 더 구체적으로 this commentthis question을 다음과 :

때문에 타이머의 목표는 소유자

I 인 일반적인 경우에 (일명 강한 참조) 사이클을 유지 왜 deallocNSTimer을 무효로하는 좋은 장소가 아닌지 궁금합니다.

NSTimer 무효화를 수행 한 다음 무효화를 사용하여 dealloc에 내 애플리케이션을 프로파일 링하고 메모리를 올바르게 해제했음을 기억합니다.

dealloc은 최신 iOS에서 다르게 작동합니까?

사실 은 NSObject 할당 해제 이전에 호출 되었습니까? dealloc은 무엇을 위해 심지어 사용됩니까? 각각의 객체의 속성을 수동으로 할당 해제하지 않았다면?

+3

NSTimer가 개체를 보유하고 있기 때문에 Dealloc이 호출되지 않습니다 (따라서 NSTimer가 무효화됩니다) – ogres

+0

시스템에서'-dealloc' 메서드를 호출하는 중 _ 해제 된 개체를 할당 해제하려고 할 때 의존 할 수 없습니다 _when_에서 타이머가 실행되는 동안 실제로 발생합니다. 반면에'-dealloc'이 결코 트리거되지 않을 때 우발적으로 강력한 유지주기를 만들 수 있으며 타이머가 백그라운드에서 멈추어 더 이상 필요하지 않은 작업을 수행 할 수있어 일관성없는 행동을 유발할 수 있습니다 심지어는 충돌하지만 앱을 나쁜 메모리 시민으로 만드는 것은 분명합니다. – holex

+0

'dismissViewController : animated :'를 호출 한 후에'UIViewController'의'dealloc'이 호출되지 않았습니까? –

답변

0

ARC는이 객체를 가리키는 참조가 없을 때만 (dealloc) 객체를 해제하고 호출합니다 (아무도 보유하지 않음).

NSTimerstrong 참조를 만들고 target을 유지합니다.

NSTimer에 여전히 개체에 대한 참조가 있으므로 dealloc은 호출되지 않습니다. dealloc이 없다면 이는 NSTimer이 결코 무효화되지 않음을 의미합니다 ... 메모리 누출 또는 충돌을 유발합니다.

deallocinvalidate 타이머가 있거나 target이 0이 될 때까지 방법이 있습니다. answer here을 살펴보십시오.