2010-01-26 91 views
4

我正在研究一個相對簡單的iPhone應用程序,該應用程序具有多輪定時器,並具有許多設置,例如輪次數和輪次長度。我們允許某些設置在定時器運行時進行設置,這意味着定時器可能正在讀取設置正在寫入的內存。沒有多個線程同時執行的代碼的關鍵部分,但來自設置的代碼可能正在嘗試寫入定時器正在讀取的內存。我的iPhone應用程序真的需要鎖定嗎?

在一個簡單的例子來說,假設我們的全局變量foo和有一個NSTimer方法,其看起來如下:

- (無效)timerTick { 的NSString * X = FOO; }

然後在設置代碼,我們這樣做的定時器運行時:

富= @「測試」;

在這個應用程序中使foo原子化還是需要某種鎖定方案?

謝謝。

回答

4

通常情況下,您不需要以通常的方式使用NSTimer來鎖定。

更詳細地說,當您使用NSTimerscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:創建定時器時,生成的定時器將添加到創建定時器的線程的運行循環中。因此,如果您通過這種方式在主線程上創建NSTimer實例,則定時器的觸發將作爲主事件循環的一部分處理,因此您註冊的回調在主線程上調用,而不在另一個線程上調用。所以,如果你自己沒有創建任何線程,那麼根本不關心鎖定等。

有關更多詳細信息,請閱讀this

+1

「這是不必要的......」所產生的計時器被添加到主運行循環中。「不,不一定。它被添加到*當前運行循環中,即當前線程上的運行循環,它可能不是主線程**。 http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/clm/NSTimer/scheduledTimerWithTimeInterval:target:selector:userInfo:重複:http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSRunLoop_Class/Reference/Reference.html#//apple_ref/occ/clm/NSRunLoop/currentRunLoop – 2010-01-27 02:03:50

+0

我認爲這是更符合你的意思:「......如果你自己沒有創建任何線程,那麼根本就不關心鎖定等。」這是正確的:如果你還沒有創建另一個線程,那麼主線程是當前線程,所以定時器將在主線程的運行循環*在這種情況下*。如果你想在線程上運行一個定時器,你必須自己創建線程,然後在該線程上創建和調度定時器。 (然後你將不得不考慮同步。) – 2010-01-27 02:06:13

+0

是的,你完全正確,彼得。謝謝你指出。 – Yuji 2010-01-27 02:11:43

0

您可以@synchronized或NSLock/NSRecursiveLock/NSConditionLock您的讀取和寫入。 更好地使用它的標準方式,而不是過早地發佈一個零富。

+0

對於NSTimers – 2010-01-26 09:38:17

相關問題