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。
我有这个代码:
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。