我有以下代码:
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
,因此run循环不会继续运行,而是会调用场景的观察者。
解决方案是不阻塞主线程。移动[self startGame]
回完成块,并固定内存泄漏。
避免在完成块中发生保留周期(并避免发生内存泄漏)的标准模式如下所示:
__weak MyClass *weakSelf = self;
[self.skView.scene fadeOutWithDuration:FADE_SEC completion:^ {
MyClass *self = weakSelf;
[self startGame];
}];
替换MyClass
为的实际类self
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句