iOS性能优化

手动布局(写宽高)和Autolayout(自动布局)性能的差别主要在子父视图添加到40个子视图的时候,才会显得区别。其他的话,性能之差很小 。 

CPU使用于当视图加载的情况下的计算坐标,加载数据,逻辑的处理,绘制和渲染还有动画了这边的事情交给GPU去处理,gpu解压jpg/png图片的时候,gpu不能直接绘制,比较耗时间,必须先解压。

tableview的复用原理,他的设计模式是享元模式,享元模式的主要核心是:采用一个共享的资源来避免大量相同内容对象的开销,公共对象池,共享节能资源。

享元模式的概念

面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降。对于这样的问题解决最简单直接的办法就是减少系统中对象的个数。所谓享元模式就是运行共享技术有效地支持大量细粒度对象的复用。系统使用少量对象,而且这些都比较相似,状态变化小,可以实现对象的多次复用。共享模式是支持大量细粒度对象的复用,所以享元模式要求能够共享的对象必须是细粒度对象。

TableView复用时,总共会生成多少个cell?

一般会生成visibleCells+1,或者+2,+3都有可能,其实visibleCells就是去获取tableView的上所有的cell,他是一个数组集合,可以将它取出来放到自己的数组里,将它遍历可以得到你想要的对应cell。栗子:http://blog.csdn.net/xiaojiuxing_csdn/article/details/50470372 

•参考tableView可以实现哪些常见自定义控件?

一般的话可以自定义一个滚动的空间。

tableView刷新优化

举个例子,比如当一个图片下载完成的时候,我才知道它的高度,然后我才去回掉reloadData的方法去刷新界面,如果它有十张图片,都是在0.1毫秒完成,我0.1秒就需要掉10次的reloadData,他和聊天信息一样,来一条信息就刷新一次,100条就刷新100次,1秒钟就刷新。所以可以优化它没有必要的reloadData这个方法。继续tableview的刷新优化,我们将用两个方法解决这个问题:

1.runloop来解决这个问题,平常我们滑动的 cell的时候,首先判断是否有图片,没有图片数据,将去下载图片,生成bitmp,缓存她的高度,然后用一个通知tablview去刷新,这是一个基本的逻辑原理,但是下面一段代码是主动区检查她的数据和高度

            self.observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(),             kCFRunLoopBeforeWaiting, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {

        CFStringRef model = CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent());

NSLog(@"%@",(__bridge NSString *) model);

CFRelease(model);

[weakSelf.indexs removeAllObjects];

NSArray *visibleCells = [weakSelf.tableView visibleCells];

for (EOCNewsTableViewCell *cell in visibleCells) {

if (fabs([cell.info rowHeight] - cell.frame.size.height) > 0.1) {

[weakSelf.indexs addObject:[weakSelf.tableView indexPathForCell:cell]];

}

}

if (weakSelf.indexs.count > 0) {

[EOCUtil runInMain:^{

NSLog(@"update Row");

[weakSelf.tableView reloadRowsAtIndexPaths:weakSelf.indexs withRowAnimation:UITableViewRowAnimationFade];

}];

}

});

在viewDidLoad的时候,添加一个runloop的观察者,监听runloop挂前的状态,将runloop的空闲时间去刷新tabview,首先是在visibleCells取出对应的cell,搜集到它们的下标,然后缓存她的高度,通过它们缓存图片的高度减去cell本身的高度,大于0.1的时候,说明有图片的高度数据,然后通知他去刷新,这样就减少一些没有必要的刷新了。需要注意的是,当退出的时候将观察者移除。

2.还有一个一个方法,就是使用对应缓存一定时间内改变cell的状态高的行,然后一次性将它们刷新

runloop的基本概念

如果当一个线程需要下载图片的时候,等网络图片下载完成,才去刷新界面。这个不是一条下载任务的线程,这是一条等待下载完成回掉数据的线程。系统为了节约资源,会将这个线程挂起来。线程谁来唤醒,什么时候唤醒,就是交给runloop去唤醒这个线程,线程挂起之后,由runloop去接受事件,等runloop接到时间原之后,就将这个委托分给对应的线程,runloop开启的时候,他有两个model的模式:

1. kCFRunLoopDefaultMode:默认mode

2. UITrackingRunLoopMode:跟踪滚动事件UISCrollview

3. kCFRunLoopCommonModes: 包括以上两个

runloop状态:即将开始,开始,执行,等待结束,结束

等线程的事情处理完之后,告诉等待状态中的runloop,继续将线程挂起,继续循环等待新的事件源。

缓存的优化

我们可以使用一个缓存的来优化性能的均衡。最简单就是sdiamge,相信只要开发ios的人都接触过着强大的第三方库。它的流程就是:

1.先检查url的合法性。

2.从内存中检查它是否有数据。

2.如有没有,将在磁盘中寻找数据。(注意,内存的读取数据是磁盘的100倍,以后或许会更大,尽量的减少I/O操作,因为扫描内存的数据,很耗时间也很耗性能)。

3.如果磁盘和内存都没有数据,判断它是否是最大的下载数量。

4.开启网络线程去下载图片数据,下载之后,将它的数据写入内存之中,如果数据大于150m,将写入磁盘之中。

5.下载完成之后判断是否有下一个下载的任务,如果有,将它添加到队列之中开启下载。

内存优化

1.imageName的优化,它一开始获取到图片的时候他不给你解压图片,一直到需要加载到界面的时候,它才会给你讲bitmp的数据解压出来,解压出来bitmp图片,如果bitmp 的数据大,它会自动帮你cache起来,如果你的应用对内存比较敏感,建议还是不要用imageName这个方法加载图片

2.可以利用自动释放池来优化内存。对象会在什么时候释放,当调用delloc的时候。延迟释放主要在mrc下可以进行去去使用,延迟释放是指当RetainCount ==0的时候,但是对象没有立即销毁,他没有调用delloc,因为延迟对象会被放入自动释放池中,当自动释放池销毁的时候,这些延迟对象会被relose掉,当它们的RetainCount=0的时候,它们才会被释放。栗子:当需要一个大量临时对象的时候,比如一个for的循环。可以添加一个释放池,在autoreleasepool池中创建这个临时对象,防止内存暴涨。autoreleasepool的创建有三个情况,runloop主线程创建的时候,比如appleDelage主函数;子线程runloop开启的时候;开启一个touchEvent点击事件的时候。

•1.为什么要使用栅格化

    是对于ui变化不大的tablview进行,进行缓存,减少计算量,避免频繁的渲染,降低内存,提交性能。

•2.如何减少主线程任务

   开启time检查性能。

•3.设计一个图片缓存库

参考sd

•4.如何显示一段长文本(文本内容假设10G)

    可以使用预加载处理,然后进行缓存,或许分段加载,加载最前和最后一页。

•5.线程数量是不是越多越好。

线程过多不是过多更好,切换需要时间,消耗性能大

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 手动布局(写宽高)和Autolayout(自动布局)性能的差别主要在子父视图添加到40个子视图的时候,才会显得区别...
    招牌猪阅读 165评论 0 0
  • 一. 如何让你的应用程序更加省电?答:(1). 如果程序用到定位,需要在定位完毕之后关闭定位,或者降低定位的频率,...
    Hevin_Chen阅读 1,123评论 0 4
  • 一、如何提高一个应用程序的性能?1、使用ARC减少内存失误,dealloc需要重写并对属性置nil。2、重用。3、...
    金歌漫舞阅读 962评论 2 6
  • 性能优化 80% 的性能优化都是不必要的, 如果应用存在明显问题. 再逐一核对. 1. 内存的优化: 重用和懒加载...
    ValienZh阅读 2,726评论 3 17
  • 我的老师跟我说过一句话,你要把我教给你的东西学会了,再去教给其他人,这样你才叫学会,不能内化为能力的知识,很难为你...
    大花儿_阅读 138评论 1 6