【问题标题】:Does running a SKTransition on a SKScene destroy the origin SKScene?在 SKScene 上运行 SKTransition 是否会破坏源 SKScene?
【发布时间】:2014-02-19 11:55:27
【问题描述】:

在 SKScene 上运行 SKTransition 是否会破坏源 SKScene?

例如:

 SKTransition *reveal = [SKTransition revealWithDirection:SKTransitionDirectionDown duration:1.0];
    GameConfigScene *newScene = [[GameConfigScene alloc] initWithSize: CGSizeMake(1024,768)]];
//  Optionally, insert code to configure the new scene.
    [self.scene.view presentScene: newScene transition: reveal];

执行过渡时当前场景会被破坏吗?还是还在记忆中?新场景是否引用了旧场景?

【问题讨论】:

  • 你能在你的问题中显示属性 self.scene 吗?

标签: ios ios7 sprite-kit


【解决方案1】:

假设您的scene 属性是这样的@property(weak) SKScene *scene;,那么答案是肯定的,当您呈现另一个场景或将其从堆栈中弹出时将被销毁。
如果您拥有像@property(strong) SKScene *scene 这样的属性,那么答案是否定的,您的场景将保留在内存中,直到您执行此操作self.scene = nil;
但请记住,SKView 会重新显示呈现的场景,因此您应该在应用程序的某个位置将其设为 nil,以避免保留循环(当您拥有强大的属性时)。

【讨论】:

    【解决方案2】:

    除了前面的答案之外,如果您仍然不确定并想轻松检查原始场景何时/是否被释放,您可以通过覆盖 dealloc 方法并记录消息/设置断点来简单地做到这一点查看它是否被运行时调用。把它放在你的旧场景中:

    -(void)dealloc {
        NSLog(@"Old scene deallocated");
    }
    

    默认情况下(如果没有在其他地方强烈引用),它将在整个过渡完成后被释放,并且新场景已完全移动到您的视图中。因此,在过渡期间,两个场景都将存在于内存中。

    【讨论】:

      【解决方案3】:

      ARC 将释放旧场景,除非您在其他地方特别强引用它。

      新场景默认不引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多