2011-09-05 84 views
1

我有關於NSTimer的問題。見下面的代碼: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]; 

目的executeDataRefresh的保留計數現在將通過1方法executeDataRefresh的每次調用增加。所以1分鐘後保留計數是60.

我知道方法retainCount不應該使用,但是這種方法真的這個「不正確」嗎?

怎麼回事?

+0

你可以添加executeDataRefresh方法的代碼嗎?我懷疑它與你的問題有關。 – ChristophK

+4

如果你知道它不應該被使用,你爲什麼要使用它? – edo42

+0

edo42:我有內存管理的問題,所以在絕望的嘗試修復它,我開始記錄retainCount ..但是,是的,你是對的,它產生了更多的問題,而不是答案。 – user521048

回答

3

NSInvocation保留其目標,因爲它需要目標仍然在計時器啓動時。這一事實是那種埋在文檔中的-[NSInvocation retainArguments]

如果接收方已經沒有這樣做,保留目標[...]
NSTimer總是指示其NSInvocation s到保留他們的論點, [...]因爲在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 它說:「分配給對象接收器作爲目標「。關於設置爲目標的對象。單詞「assign」的用法很有意思:) – user521048

+0

這裏使用「assign」這個詞不太可能與聲明屬性的'assign'關鍵字有關,這意味着內存管理。但是,我錯誤地認爲'NSInvocation'自動地保留了它的目標。它不會,但是'NSTimer'會導致它這樣做,並且我已經添加了一個指向這個文檔的引用。 –