Skip to content

Instantly share code, notes, and snippets.

@JeOam
Last active October 10, 2017 03:15
Show Gist options
  • Save JeOam/bc2c010eff0b0415a8c9 to your computer and use it in GitHub Desktop.
Save JeOam/bc2c010eff0b0415a8c9 to your computer and use it in GitHub Desktop.
iOS 应用性能调优 Tips

检测 ViewController 是否被释放:

- (void)dealloc{
    NSLog(@"dealloc this ViewController ");
}

注意如果使用了 block,而且 block 中引用了 self,会导致 ViewController 退出后,不被释放; 需将用到 self 的地方改为 __weak __typeof(&*self)weakSelf = self 中的 weakSelf

小 tips:单文件内搜索:^ 可查看本文件用到 block 的地方。


@JeOam
Copy link
Author

JeOam commented Dec 5, 2014

1. 把图片资源压缩到最小

iOS app通常都会使用图片资源,程序运行时会把这些图片从磁盘加载到内存,如果图片很大,加载速度就会很慢。为了提高性能,需要尽量压缩图片资源。苹果公司的UIKit 开发者Andy Matuschak指出:使用resizable image是最快的方法。

2. 延迟主线程操作

把不需要在主线程执行的任务放到 NSOperationQueue或者Grand Central Dispatch,这个自不用说。
对于需要在主线程执行的任务,需要注意不要干扰用户的操作,可以把这些任务分为以下2组:
1)View updates:view的任何改变都需要在主线程中。在iOS中延后这些操作很容易,有个规则叫做:不要调用我,我来调用你。(do not call us, we’ll cal you)。绝对不要主动调用drawRect:,调用setNeedsDisplay,然后iOS会在view停止滚动的时候重新渲染view。
2)Processing: 有些很关键的任务不能在后台线程执行,例如保存Core Data database, 改变内存中的状态等等。可以把这些任务放到独立的代码块,并且在Default Runloop mode中执行,例如:

[self performSelectorOnMainThread:@selector(processDataOnMainThread:)  withObject:dictionaryOfParameters
                    waitUntillDone:NO
                   modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]]

当用户开始滚动scrollview或者tableview的时候,run loop mode会被设置成 Common modes。当用户停止滚动时,它会被重置为Default Mode。因此,如果你直接使用[self processDataOnMainThread:dictionaryOfParams] ,那么函数将立即执行,而不管用户是否还在滚动view。但是如果用上面给的方法,那么iOS将在用户停止滚动view之后执行你的代码。

3. 保持内存使用平滑

下面是几个内存使用的尖峰时刻:
a) app 启动时:加载尽量少的对象,会加快启动速度。
b) View Controler初始化时:使用尽量少得view,或者延迟实例化。
c) UIWebview:UIWebview非常耗内存。使用时需要注意。

4. 避免不必要的图片缓存

通常我们会用imageNamed:来加载图片,但是用这个API有个问题,就是它会缓存加载的image。因此,对于那些被重用的图片,这个API很高效。但是对于那些使用很少的图片,用这个就很耗内存,那怎么才能及时的释放掉内存呢。使用initWithContentsOfFile:即可。

NSString path = [[NSBundle mainBundle] pathForResource:fileName ofType:fileType];  
UIImage image = [[UIImage alloc] initWithContentsOfFile:path]; 
…  
[image release];

举个简单的例子,程序第一次使用时,会加载很多新手引导图片, 如果用 initWithContentsOfFile:,这些图片所占用内存可以很快被释放,试试就知道。

参见:

1)https://news.ycombinator.com/item?id=4645585
2)http://robots.thoughtbot.com/post/33427366406/designing-for-ios-taming-uibutton
3)http://eng.pulse.me/tips-for-improving-performance-of-your-ios-application/

另外还有篇文章一起分享给大家:iOS应用性能调优的25个建议和技巧 英文原文:http://www.raywenderlich.com/31166/25-ios-app-performance-tips-tricks

via click

@zzu-dream
Copy link

8.0以后用WKWebView取代UIWebView来解决UIWebView非常耗内存的方案

@julianL0veios
Copy link

wkwebview有些问题

@AironMore
Copy link

WKWebView first load 很慢, 而且无法使用 NSURLProtocol

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment