基于Apple官方相机Sample App开发,拍摄3张照后崩溃求助
问题分析与解决方案
基于你提供的代码和场景(iOS17 + Xcode15,拍摄3张照片后崩溃),以下是可能的崩溃原因及对应修复方案:
1. 相机资源未正确释放导致内存泄漏
你基于的Apple相机示例中,Camera类(代码未贴出但通过model.camera调用)可能在多次拍照后未清理AVCapturePhoto等临时资源,导致内存占用持续飙升触发崩溃。
修复:
在Camera类的takePhoto()回调逻辑中,处理完照片数据后立即释放临时持有的AVCapturePhoto对象,避免强引用长期占用资源。
2. SwiftUI Image转UIImage的内存开销问题
你使用的asUIImage()扩展通过渲染UIView获取图片,多次调用会累积大量图形资源;同时直接将高分辨率照片的pngData()存入数组,会快速耗尽内存。
修复:
- 跳过SwiftUI Image中间转换,直接从相机捕获的原始
AVCapturePhoto提取数据:在DataModel的拍照回调中,用photo.fileDataRepresentation()获取原始数据存储,无需转成SwiftUI Image再转回UIImage。 - 对图片数据进行压缩(如果不需要原始分辨率):
// 假设DataModel中存储了捕获的原始UIImage if let originalImage = model.capturedOriginalImage { let compressedData = originalImage.jpegData(compressionQuality: 0.7) ?? Data() userViewModel.NotePhotoDatas.append(compressedData) }
3. 动画触发逻辑不合理导致不必要重绘
代码中thumbnailImage的动画绑定值为固定的1.0,会导致每次视图更新都触发动画,引发不必要的视图重绘和内存消耗。
修复:
将动画的触发值改为model.thumbnailImage,仅当图片实际变化时才执行动画:
model.thumbnailImage? .resizable() .aspectRatio(contentMode: .fill) .frame(width: 60, height: 60) .clipShape(RoundedRectangle(cornerRadius: 10, style: .continuous)) .animation(.spring(), value: model.thumbnailImage)
4. 相机会话生命周期未妥善管理
当前代码仅在视图出现时启动相机,但未在视图消失时停止会话,多次进入退出相机视图可能导致多个相机会话同时占用系统资源。
修复:
添加视图消失时的相机停止逻辑:
// 在sCameraView的body中添加 .onDisappear { Task { await model.camera.stop() } }
5. 内存数组累积过大
userViewModel.NotePhotoDatas作为内存数组,不断添加大图数据会导致内存持续增长。若无需长期保存在内存,应持久化到磁盘而非直接存数组。
修复:
保存照片时写入本地文件,仅存储文件路径:
if let data = image?.pngData() { let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] .appendingPathComponent("photo_\(Date().timeIntervalSince1970).png") try? data.write(to: fileURL) userViewModel.NotePhotoPaths.append(fileURL.path) // 存储路径而非完整数据 }
调试建议
- 使用Xcode的Memory Graph Debugger查看内存泄漏点,确认是否有未释放的
AVCapture对象或图片数据。 - 查看崩溃日志的具体报错信息(如
EXC_BAD_ACCESS或内存警告),精准定位崩溃根源。
内容的提问来源于stack exchange,提问作者Tracy9988 Xu
相关产品推荐
相关产品推荐

