在sprite工具包中,我一直试图解决为什么我的SKScene不会解除分配,我相信我最终更接近答案了:我使用了很多SKAction
带有completion
块的s。我刚学会了必须使用弱引用。
我该如何正确地做到这一点?块内的一切都必须弱吗?例如,我刚刚更改了我的一个块看起来像这样:
__weak typeof(self.heli) weakheli = self.heli;
[weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{
ghostMode = NO;
}];
我是否还必须制作__weak typeof(ghoseMode) weakGhostMode = ghostMode
语句并仅更改块内的weakGhostMode
?
另一个例子,应该:
[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{
if (mgFiring) {
[self fireMG];
}
}];
改为:
[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{
if (mgFiring) {
[weakSelf fireMG];
}
}];
感谢您的帮助!当我通过教程学习Sprite Kit时,我们从未被警告过使用具有强引用的completion
块。
答案 0 :(得分:1)
这不需要__weak,因为heli对象用于运行操作,它不会在里面块中引用。
__weak typeof(self.heli) weakheli = self.heli;
[weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{
ghostMode = NO;
}];
所以这没关系:
[self.heli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{
ghostMode = NO;
}];
同样如此:
[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{
if (mgFiring) {
[weakSelf fireMG];
}
}];
应该是:
[self runAction:[SKAction waitForDuration:.1f] completion:^{
if (mgFiring) {
[weakSelf fireMG];
}
}];
只在块内需要(如果有的话)weak.Self。