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

Posted

技术标签:

【中文标题】在 SKScene 上运行 SKTransition 是不是会破坏源 SKScene?【英文标题】: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 吗? 【参考方案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 将释放旧场景,除非您在其他地方特别强引用它。

新场景默认不引用。

【讨论】:

以上是关于在 SKScene 上运行 SKTransition 是不是会破坏源 SKScene?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SpriteKit 中的 SKScene 上显示 AdMob 横幅广告?

在 SKScene 上展示 viewController

如何在 Swift 中将 SKScene 覆盖在 SCNScene 上?

SKScene 中的 UIPanGestureRecognizer

iPad 模拟器上的 SKScene 问题无法在 Xcode 11 beta 7 中填满屏幕

模态转换后解除分配 SKScene