zoukankan      html  css  js  c++  java
  • iOS性能优化技巧

    通过静态 Analyze 工具,以及运行时 Profile 工具分析性能瓶颈,并进行性能优化。结合本人在开发中遇到的问题,可以从以下几个方面进行性能优化。

    一、view优化

    1、不透明的View 设置为opaque。

    2、根据实际情况重用、延迟加载或预加载View。

    3、减少subviews数量,定制复杂cell使用drawRect。尽量使用drawRect而不是layoutSubView。

    4、不直接调用drawRect、 layoutSubviews方法。万不得已时可以用替代方法: setNeedsDisplayInRect,layoutIfNeeded,替代方法也尽量不要调用,通过合理的代码结构解决重布局问题,尽量一次完成布局。

    二、UITableView优化

    1、正确使用‘reuseIdentifier’重用cell。

    2、尽量使所有的view opaque。

    3、减少subviews数量,定制复杂cell使用drawRect。

    4、尽量不调用‘cellForRowAtIndexPath’。调用cellForRowAtIndexPath会导致cell缓存失效

    5、cache尽可能多的东西,包括行高。

    三、缓存优化

    1、缓存不大可能改变但是需要经常读取的东西。远端服务器的响应、图片、计算结果。

    2、重用大开销对象。对于初始化很慢的对象通过添加属性的方式保持该对象,保证只被初始化一次,多次复用。如NSDataFormatter。

    3、方法指针缓存。如果一个方法在一个循环次数非常多的循环中使用,在进入循环前使用methodForSelector获取该方法的IMP,在循环体中直接调用该IMP。

    四、线程优化

    1、 耗时操作使用子线程进行,或者放入任务队列中。

    2、同步使用串行队列代替同步锁。

    3、不重要的任务放在idle中运行

    - (void)idleNotificationMethod {
        // do something here
    }
    
    - (void)registerForIdleNotification 
    {
        [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(idleNotificationMethod)
            name:@"IdleNotification"
            object:nil];
            
        NSNotification *notification = [NSNotification
            notificationWithName:@"IdleNotification" object:nil];
            
        [[NSNotificationQueue defaultQueue] enqueueNotification:notification
          postingStyle:NSPostWhenIdle];
    } 
    

    五、内存优化

    使用autorelease pool 降低内存峰值

    六、代码细节优化

    1、不在viewWillApear中进行费时操作

    2、如果关键代码用C/C++效率更高就使用C/C++

    七、图片优化

    对图片数据进行decode。在子线程中设置image的大小后,在imageview中使用缩放后的image。原因:由于UIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像,所以在每次画图的时候,会有一个解压操作,UIImage初始化后仅仅是把图片加载到内存中,而实际的解码和重采样是在图片需要显示时才进行。

    //图片重采样,在子线程中进行
    CGSize itemSize = CGSizeMake(width, height);//实际要缩放的大小
    UIGraphicsBeginImageContext(itemSize);
    CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
    [image drawInRect:imageRect];
    UIImage newImage = UIGraphicsGetImageFromCurrentImageContext(); //重采样后的图片
    UIGraphicsEndImageContext();
    
  • 相关阅读:
    停止Java线程,小心interrupt()方法
    SLG手游Java服务器的设计与开发——架构分析
    大数据Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解
    【转】阿里云主机购买使用教程
    使用 Apache MINA 开发高性能网络应用程序
    浅谈Java的Mina框架传递对象
    解析Mina代码三部曲
    java 子类继承父类 -- 重写、覆盖
    经度之战
    [USACO1.3]虫洞wormhole
  • 原文地址:https://www.cnblogs.com/zy1987/p/4429217.html
Copyright © 2011-2022 走看看