Memory leaks 使用____弱

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]

在sprite kit中,我一直在努力找出为什么我的SKScene不会取消分配,我相信我终于离答案更近了一步:我使用了很多带有
完成
块的
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;
}];