zoukankan      html  css  js  c++  java
  • replaceScene、pushScene、popScene区别

    最近在开发过程中遇到很多切换场景的时候概率性崩溃,内存暴增的问题。
    因此总结一些开发中需要注意的要点,
     

    1. 切换全屏场景的时候最好使用replaceScene而不是pushScene。

    因为pushScene并不会销毁前一个scene,仅仅是将后一个scene按照堆栈的方式加入到前一个scene的上面。如果自身代码中内存管理写的不好的,利用pushScene很难发现该方面的问题,一旦崩溃定位都很难定位。replaceScene可以及早的将隐含的问题给暴露出来。
     
    2. 尽量不要在onEnter里面初始化精灵Sprite
    这个就和上一条有点关系了,如果使用了pushScene,那么再popScene的时候是不会调用前一个场景的init方法的,所以有同学就喜欢把一些初始化放在onEnter里面,具体为什么不好,我们来看一下不同切换场景的时候,每个Scene的生命周期就知道了。
    假设scene A是活动场景,现在我们用scene B来pushScene替换A,A和B的生命周期是这样的:
    B ---- init();
    A ---- onExit();
    B ---- onEnter();
    B ---- onEnterTransitionDidFinish();
     
    此时popScene,弹出scene B,函数调用如下:
    B ---- onExit();
    B ---- 析构函数被调用
    A ---- onEnter();
     
    从上面可以看出以下几点,
    1. A的析构函数始终未被调用,因此A一直在内存中。
    2. 先执行B的init()函数,之后才调用A的onExit()方法,再之后才调用B的onEnter();所以初始化最好应该放在init中来初始化。在上一个场景退出之前初始化好后一个场景需要的资源。
     
    同样的,我们再来看一下replaceScene切换场景,scene的生命周期
    假设scene A是活动场景,现在我们用scene B来replaceScene替换A,A和B的生命周期是这样的:
    B ---- init();
    A ---- onExit();
    A ---- 析构函数被调用
    B ---- onEnter();
    B ---- onEnterTransitionDidFinish();
     
    此时B replace A回来的调用跟上面一样,如下:
    A ---- init();
    B ---- onExit();
    B ---- 析构函数调用
    A ---- onEnter();
  • 相关阅读:
    ios UIWebView截获html并修改便签内容(转载)
    IOS获取系统时间 NSDate
    ios 把毫秒值转换成日期 NSDate
    iOS  如何判断当前网络连接状态  网络是否正常  网络是否可用
    IOS开发 xcode报错之has been modified since the precompiled header was built
    iOS系统下 的手机屏幕尺寸 分辨率 及系统版本 总结
    iOS 切图使用 分辨率 使用 相关总结
    整合最优雅SSM框架:SpringMVC + Spring + MyBatis 基础
    Java面试之PO,VO,TO,QO,BO
    Notes模板说明
  • 原文地址:https://www.cnblogs.com/xiajianwei/p/5159605.html
Copyright © 2011-2022 走看看