2015-03-31 91 views
0

我有這樣的代碼:Objective-C信號量問題?

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 
[self.skView.scene fadeOutWithDuration:FADE_SEC completion:^ { 
    dispatch_semaphore_signal(semaphore); 
}]; 
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); 
[self startGame]; 

不幸的是,該信號不被通知。我不知道爲什麼...

這裏的fadeOutWithDuration:completion:代碼:

- (void) fadeOutWithDuration:(NSTimeInterval)duration completion:(void (^)(void))predicate { 
    SKAction * action = [SKAction fadeAlphaTo:0.0 duration:duration]; 
    [self runAction:action completion:predicate]; 
} 

我以前在完成了塊[self startGame],但似乎在這個代碼塊中出現的內存泄漏,所以我決定使用信號量來確保該塊沒有保留任何東西。關於爲什麼信號量沒有被髮信號的任何想法?

在此先感謝!

+0

淡出是否真的發生? – 2015-03-31 04:04:38

+0

不。它在我添加信號燈之前做過。我認爲發生的是信號量阻塞了主線程,這阻止了fadeOut方法的完成,然後調用信號量信號。 – Jake 2015-03-31 04:05:50

回答

0

場景通過向主線程的運行循環註冊觀察者來在主線程上執行其每幀處理。您通過調用dispatch_semaphore_wait來阻止主線程,所以運行循環不會繼續運行,並可以調用場景的觀察者。

解決方法是不阻塞主線程。將[self startGame]移回完成塊,並修復內存泄漏。

用於在完成塊,避免一個保留週期(以及隨之而來的內存泄漏)標準圖案看起來像這樣:

__weak MyClass *weakSelf = self; 
[self.skView.scene fadeOutWithDuration:FADE_SEC completion:^ { 
    MyClass *self = weakSelf; 
    [self startGame]; 
}]; 

MyClass替換與實際類self

+0

是的,正如我在我的評論中提到的...信號量阻塞了主線程。另外,我嘗試在嘗試信號量之前使用弱參考。這種方式是行不通的,因此絕望的信號量嘗試... – Jake 2015-03-31 04:33:56