用__weak避免泄漏

时间:2014-11-20 19:30:33

标签: memory-leaks sprite-kit objective-c-blocks

在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块。

1 个答案:

答案 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。