2011-09-05 8 views
1

NSTimer에 관한 문제가 있습니다. executeDataRefresh의이 카운트가 이제 1 방법 executeDataRefresh의 각 호출을 증가 유지NSTimer 보유 개수 증가, 이유는 무엇입니까?

NSTimeInterval timeInterval = 1.0f; 
SEL selector = @selector(executeDataRefresh); 

NSMethodSignature *methodSignature = [[ExecuteDataRefesh class] instanceMethodSignatureForSelector:selector]; 

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; 
[invocation setTarget:executeDataRefresh]; 
[invocation setSelector:selector]; 

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval: timeInterval invocation:invocation repeats:YES]; 

목적 : 다음 코드를 참조하십시오. 1 분 후에 보유 수는 60입니다.

나는 retainCount 메서드를 사용해야하지만이 메서드는 실제로이 "잘못된"메서드라는 것을 알고 있습니까?

어째서?

+0

executeDataRefresh 메서드의 코드를 추가 할 수 있습니까? 나는 그것이 당신 문제와 관련이 있다고 생각합니다. – ChristophK

+4

사용해서는 안되는 이유를 알고 계시다면 왜 사용하십니까? – edo42

+0

edo42 : 메모리 관리에 문제가있어서 필자는 그것을 고치려고 노력했는데 retainCount를 기록하기 시작했습니다.하지만 네가 맞다면 대답보다 더 많은 질문이 생깁니다. – user521048

답변

3

NSInvocation은 타이머가 작동 할 때 대상이 계속 있어야하기 때문에 대상을 유지합니다. 그 사실은 일종의 -[NSInvocation retainArguments]에 대한 문서에 묻혀 :

수신기가 아직 수행하지 않은 경우는, 목표를 유지 [...]
NSTimer의 항상 자신의 주장을 유지하기 위해 자신의 NSInvocation의 지시, [...] 왜냐하면 일반적으로 NSTimer 화재가 발생하기 전에 지연이 있기 때문입니다.

이것은 누군가가 "프레임 워크 클래스가 모르게 물건을 보유하고있을 수 있습니다"라고 말한 것을 의미합니다. Don't worryabsolute retain counts.

대신 * 걱정할 필요가있는 것은이 코드를 실행할 때마다 (사실 상당히 자주 발생한다고 생각되는) 새로운 NSInvocation을 만들고 정확히 동일한 속성을 가진 NSTimer 인스턴스를 반복한다는 것입니다 마지막으로 기억의 낭비처럼 보입니다.


* 테스트 코드가 아닌 한.

+0

나는 setTarget에 대해 읽었습니다 : http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/Reference/Reference.html 그것은 " target as receiver as target. "대상으로 설정된 개체에 대해. 단어 "할당"의 사용은 흥미 롭습니다. – user521048

+0

"할당"이라는 단어를 사용하면 선언 된 속성에 대해 '할당'키워드와 관련이 없으므로 메모리 관리가 필요합니다. 그러나, 나는'NSInvocation'이 자동적으로 그 목표를 유지하고 있다고 잘못 생각했다. 그러나 NSTimer가 그렇게하기 때문에, 이것을 나타내는 문서에 대한 참조를 추가했습니다. –