思考🤔在项目上线需求稳定之后,如何给app做进一步的优化?可以从下面几点入手:
- Instruments
- 静态分析
- 包大小优化
- 电能消耗
- 卡顿监控
- Bugly
- 内存
- 启动优化
Instruments
Instruments是Xcode自带的性能监控工具,它的功能非常强大。

下面我们就按照官方文档,一步步学习如何使用, 这里有个wwdc2018的视频教程https://developer.apple.com/videos/play/wwdc2018/410,纯英文没字幕,结合文档多看几遍吧,我是用iina打开的。
首先创建Instruments工程
- In Xcode, choose File > New > Project.
- In the sheet that appears, select macOS.
-
Under Other, select Instruments Package, then click Next.
image.png
接着对Instruments-demo.instrpkg文件进行配置
- 通过
os_log_create(…)
创建日志句柄 - 标记一个你想计时或想知道何时开始和结束的函数或代码块:以
os_signpost_interval_begin(…)
开始,以os_signpost_interval_end(…)
结束,⚠️它们是成对出现的 - 以及好多好多,文档里都有做了详细的说明
<import-schema>tick</import-schema>
<instrument>
<id>com.gs2000eHappy</id><!-- MARK: 填写一个bundle id -->
<title>Ticks</title>
<category>Behavior</category>
<purpose>Instrument drawing ticks every 10ms</purpose>
<icon>Generic</icon>
<create-table>
<id>tick-table</id>
<schema-ref>tick</schema-ref>
</create-table>
<!-- Define graph to draw for your Instrument (optional) -->
<graph>
<title>Ticks</title>
<lane>
<title>Ticks</title>
<table-ref>tick-table</table-ref>
<!-- plot, plot-template or histogram elements -->
<plot>
<value-from>time</value-from>
</plot>
</lane>
</graph>
<!-- Define at least one detail view for your Instrument -->
<list>
<title>Ticks</title>
<table-ref>tick-table</table-ref>
<column>time</column>
</list>
</instrument>
build 弹出以下界面,说明编译通过

依次点击Instrument-Preference-Package,就可以看到刚才编写的自定义 Instruments 工具

如何使用这个自定义的 Instruments 工具呢?
打开Xcode自带的Instrument,选择要测试的模块,我这里选择了Leaks,点击+号搜索出刚才定义的工具,并拖拉到track filter

选择要测试的软件,点击⭕️开始

接着就是要学习如何看这个图形界面了
Leak
新建一个MRC项目工程用于测试

按照前面提到的进行Leak测试,如下图,其中红色打叉就是内存泄漏的地方

然后我们可以通过光标,选定某个段缩小范围来查找内存泄漏的地方,从图中我们可以很好的定位到内存泄漏的代码片段,从而入手解决

也就是该部分代码
- (IBAction)buttonClick:(id)sender {
dog * dg = [[dog alloc]init];
[dg retain];
}
Time Profiler


静态分析
静态分析内存泄漏及代码逻辑错误,除了Xcode自带的Analyze外还有OCLint、infer、Clang
-
Analyze 依次点击Xcode-Product-Analyze,蓝色箭头即为出现问题部分,编译器也会给出对应的错误提示。
image.png
-
The 'viewDidAppear:' instance method in UIViewController subclass 'WGOrderTableViewController' is missing a [super viewDidAppear:] cal
系统方法没有调用父类 -
Value stored to 'shopH' during its initialization is never read
变量赋值了缺没有使用过 -
Returning 'self' while it is not set to the result of '[(super or self) init...]'
stackoverflow参考链接
例如
-(instancetype)initWithFrame:(CGRect)frame{
if (self==[super initWithFrame:frame]) {
[self setupUI];
}
return self;
}
解决
-(instancetype)initWithFrame:(CGRect)frame{
if ((self=[super initWithFrame:frame])!=nil) {
[self setupUI];
}
return self;
}
包大小优化
- App Thinning
- 删除无用的图片资源,使用开源的第三方https://github.com/tinymind/LSUnusedResources
- 将图片资源转成WebP,链接需要翻墙https://developers.google.com/speed/webp/docs/precompiled,或者使用isparta直接将PNG格式转成WebP,后者是一个图形界面操作。
- 删除无用代码
- 这个挺有用的,具体操作步骤写在这里了
电能消耗
卡顿监控
Bugly
内存
启动优化
文章中用到的demo链接🔗
网友评论