在 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 横幅广告?
如何在 Swift 中将 SKScene 覆盖在 SCNScene 上?
SKScene 中的 UIPanGestureRecognizer