zoukankan      html  css  js  c++  java
  • iOS CPU占有率达到了100%甚至更多,然后导致App闪退

    今天在真机调试的过程中,发现了一个严重的问题,发现CPU的使用率竟然达到了100%,以至于会导致运行内存占用过高,被系统的看门狗机制给杀掉。 

    下面就讲一讲怎么去定位这个问题:

    1.打开Xcode,把项目跑动起来,然后选择这个选项卡

    2.现在就可以看到这个画面 

    3. 现在我们可以看到这个页面,发现我的CPU达到了 105%,这肯定是有问题,那现在怎么办呢,我们可以看到右边的图,点击Profile in Instruments. ---》 然后点击Transfer.

      

    4. 现在就进入到Instruments中,我们看看究竟发生了什么,到底是什么情况,导致出现了这种问题。

       1. 首先,我通过观察CPU占用率,各个页面进行排查,看是进行了何种操作后,才出现的这种CPU占用率居高不小。

       2. 我很庆幸,我很快就定位到了原因。所以我可以知道是进入某一个页面,触发了某种操作后,然后,就会出现这种情况

       3. 现在就可以通过Instruments来进行定位,来看看是执行什么代码,导致了这种非常耗时的操作,让CPU一直如此忙碌。 

      4.选中Xcode先把程序(command + R)运行起来

      5.再选中Xcode,按快捷键(command + control + i)运行起来,此时Leaks已经跑起来了

      6.由于Leaks是动态监测,所以我们需要手动操作APP,一边操作,一边观察Leaks的变化,当出现红色叉时,就监测到了内存泄露,点击右上角的第二个,进行暂停检测(也可继续检测,当多个时暂停,一次处理了多个). 

    扩展: 查内存泄露具体方法 点击打开链接l

    5. 电脑卡爆了,哎。 回去了在截图,反正最后是跟踪到了 Runloop下。 有一个行为一直在占据着主线程,并且不释放,所以导致CPU一直在大量消耗,内存也慢慢渐长,一般能造成这种情况的就只有循环,并且一直没有释放,我利用Instruments中的leaks,然后进行了各种各样的内存泄露的检测及修复, 也正是这样,我发现了问题的所在。 原来是我写的有一个方法有问题。 我写的代码如下:

    我们很清晰的看到如果条件为真,这就是一个死循环,我的PM那时候,这儿就想做一个图片一直闪烁的效果,这儿可以采用三种方案,一种是用这种循环引用来执行一套方法, 一种是通过NSTimer来定时去调用一个方法。我开始选择了前者,那时候也知道后果,也许这个死循环会一直存在下去,直到这个VC被dealloc,最后一种是通过 core animation来实现。 这种事最推荐的,具体写法,我会在后面开博客进行讲解

     
    1. -(void)animationAction:(bool)isNeedbreak{  
    2.     if(!isNeedbreak) {  
    3.         [self performSelector:@selector(animationAction:) withObject: [NSNumber numberWithBool:YES] afterDelay:2];  
    4.     }  
    5. }  
    2. 由于有上面这个担心所以,我在popviewcontroller, 控制器出栈的时候,我调用了如下方法,那个时候太粗心了,大概比方,是我想延迟2s执行一个方法,这个过程中,我想终止方法,那就只有通过调用下面两种随意一种,我却很天真的以为,这样就可以完美的终止死循环的调用。 
    1. //这个是取消所有的延迟执行函数。  
    2.   [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(animationAction:) object:[NSNumber numberWithBool:YES]];  
    3.   [NSObject cancelPreviousPerformRequestsWithTarget:self];  



    
    

    3. 发现问题依然存在,所以只能用我的第二种解决办法, 用NSTimer来代替他。代码如下

     
    1. NSTimer *animationTwoTime = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(productBrandIconAnimationWithIsBreak:) userInfo:[NSNumber numberWithBool:NO] repeats:YES];  

    4. 然后在vc出栈的时候,然后把NSTimer进行 invalidate下。

    总结:

         1.以后一定要慎用用for循环来进行实现动画的连续执行. 
         2. 这种动画效果尽量用 core animation来进行解决。

  • 相关阅读:
    2013年春季献礼 微软认证考试5.5折优惠,截止到5月25日
    邮件服务器脱离域灾难恢复
    How to: Hide the Ribbon in SharePoint 2010
    sharepoint2010如何根据用户登录名获取有权限的列表记录?
    sharepoint 2010的版本比较
    SharePoint2010文档归档策略(2)从放置库转移到自己定义的文档库
    如何设置sharepoint的栏目不在新增或修改页面显示?
    如何删除 SharePoint Workspace 2010 中的临时数据和永久数据
    Windows XP 默认蓝色桌面的 RGB
    System.Net.Socket Tcp 学习笔记(一)
  • 原文地址:https://www.cnblogs.com/isItOk/p/6582878.html
Copyright © 2011-2022 走看看