Objective-C 信号量问题?

Objective-C Semaphore Issues?

我有这个代码:

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],但在这段代码中似乎发生了内存泄漏,所以我决定改用信号量来确保该块没有保留任何事物。知道为什么信号量没有发出信号吗?

提前致谢!

场景通过在主线程的 运行 循环中注册观察者来在主线程上执行其每帧处理。您通过在主线程上调用 dispatch_semaphore_wait 来阻塞主线程,因此 运行 循环不会继续 运行ning 并调用场景的观察者。

解决方法是不阻塞主线程。将 [self startGame] 移回完成块,并修复内存泄漏。

在完成块中避免保留循环(以及随之而来的内存泄漏)的标准模式如下所示:

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

MyClass替换为self的实际class。