Memory leaks 使用____弱
在sprite kit中,我一直在努力找出为什么我的SKScene不会取消分配,我相信我终于离答案更近了一步:我使用了很多带有Memory leaks 使用____弱,memory-leaks,sprite-kit,objective-c-blocks,Memory Leaks,Sprite Kit,Objective C Blocks,在sprite kit中,我一直在努力找出为什么我的SKScene不会取消分配,我相信我终于离答案更近了一步:我使用了很多带有完成块的SKActions。我刚学会我必须使用弱引用 我如何正确地做到这一点?区块内的所有东西都必须是弱的吗?例如,我最近将一个块更改为如下所示: __weak typeof(self.heli) weakheli = self.heli; [weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f]
完成块的SKAction
s。我刚学会我必须使用弱引用
我如何正确地做到这一点?区块内的所有东西都必须是弱的吗?例如,我最近将一个块更改为如下所示:
__weak typeof(self.heli) weakheli = self.heli;
[weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{
ghostMode = NO;
}];
我是否也必须做一个弱类型的(ghoseMode)weakHostMode=ghostMode
语句,并且只在块内更改weakHostMode
另一个例子是,应:
[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{
if (mgFiring) {
[self fireMG];
}
}];
改为:
[weakSelf runAction:[SKAction waitForDuration:.1f] completion:^{
if (mgFiring) {
[weakSelf fireMG];
}
}];
谢谢你的帮助!当我通过教程学习Sprite Kit时,我们从未被警告过使用强引用的完成
块。这不需要弱引用,因为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];
}
}];
weakSelf只在块内部需要(如果需要的话)。你怎么知道你的SKScene
没有被释放?你用仪器测试过你的游戏吗?@0x141E是的,我用仪器测试过,每次我开始一个新的游戏场景时,记忆都会上升,再也不会下降。第二,我已经使用了我的SKScene
的dealoc
方法,但它从未被调用。我在你提供的代码中没有看到任何可以保留SKScene
@0x141E的东西。好吧,正在保留场景,仪器发现泄漏,所以我不知道还能做什么?向所有操作添加弱指针是否解决了问题?为什么不需要ghostMode的弱版本?另外,我可以将它们保留为使用弱变量调用操作吗?我已经检查过了,把其中的130个改成了。幽灵模式是一个傻瓜吗?那它不可能很弱,它不是一个物体。
__weak typeof(self.heli) weakheli = self.heli;
[weakheli runAction:[SKAction fadeAlphaTo:1.0f duration:1.0f] completion:^{
ghostMode = NO;
}];