【iOS】包大小和性能稳定性优化
包大小优化
-
图片
-
LSUnusedResources 扫描重复的图片
-
ImageOptim,压缩图片
-
-
压缩文件
- 优化音视频资源 ,使用MP3 代替 WAV
ffmpeg -i input.mp3 -b:a 128k output.mp3
- 视频 H.265(HEVC) 代替 H.264 ffmpeg
ffmpeg -i input.mp4 -vcodec libx264 -crf 28 -preset fast -acodec aac -b:a 128k output.mp4
- 优化 JSON / XML / Plist 压缩,去掉空格,减少 Key 长度
jq -c . input.json > output.json xmllint --format input.xml | tr -d '\n' > output.xml plutil -convert binary1 input.plist -o output.plist
-
Enable Bitcode 能打开就打开
-
代码优化,infer代码走查并优化
-
Swift Package Manager 代替cocoapods
-
使用 WKWebView 代替 UIWebView,WKWebView 体积更小,性能更优
ios性能和稳定性优化
- 内存管理优化(使用 weak 和 unowned:特别是在闭包和委托中,确保避免循环引用。weak 引用会在对象被销毁时自动设为 nil,unowned 引用则不会。)
class MyClass {
var closure: (() -> Void)?
func setupClosure() {
closure = { [weak self] in
self?.doSomething()
}
}
}
- 大图片压缩
func compressImage(_ image: UIImage) -> UIImage? {
let imageData = image.jpegData(compressionQuality: 0.5)
return UIImage(data: imageData!)
}
- 避免主线程阻塞
DispatchQueue.global(qos: .background).async {
// 执行后台任务
let result = fetchData()
DispatchQueue.main.async {
// 更新 UI
self.updateUI(with: result)
}
}
-
UI 渲染与布局优化
- 减少视图层次
- 避免过度绘制
- 使用异步渲染
UIView.animate(withDuration: 0.3, animations: { self.view.alpha = 0.5 })
-
网络请求优化
- 使用缓存机制
- 压缩和优化网络数据 zip
- 懒加载和分页加载
func loadMoreData(page: Int) { let url = URL(string: "https://example.com/api/data?page=\(page)")! URLSession.shared.dataTask(with: url) { data, response, error in if let data = data { DispatchQueue.main.async { self.updateUI(with: data) } } }.resume() }
-
应用启动优化
- 延迟加载非关键资源
func applicationDidFinishLaunching(_ application: UIApplication) { loadEssentialResources() DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { self.loadNonEssentialResources() } }
-
后台任务优化
func beginBackgroundTask() { let taskID = UIApplication.shared.beginBackgroundTask { // 任务完成后的清理代码 } // 执行后台任务 }
-
避免频繁更新定位信息,限制定位更新的频率和精度,避免过度消耗电池。
_manager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
-
电池优化,低功耗模式适配
if ProcessInfo.processInfo.isLowPowerModeEnabled {
// 优化应用,减少后台任务或禁用某些功能
}