banchichen / TZImagePickerController

一个支持多选、选原图和视频的图片选择器,同时有预览、裁剪功能,支持iOS6+。 A clone of UIImagePickerController, support picking multiple photos、original photo、video, also allow preview photo and video, support iOS6+
MIT License
8.07k stars 1.87k forks source link

选择图片的瞬间还是出现内存暴增的问题 #778

Closed MarginHui closed 6 years ago

MarginHui commented 6 years ago

我看到TZImagePickerController里面已经修复了瞬间内存过高的问题,但是我们app在使用这个库的时候,快速选择几张图片的瞬间还是出现内存暴增的问题(50M-100多M),但不是每次选择图片都有内存暴增,如果多试几次,有时还会出现暴增,我们线上使用的版本是1.9.8版本。

使用: NSInteger seletMaxImages = kMaxImageUploat - self.vm.imageArray.count; TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:seletMaxImages delegate:self]; imagePickerVc.showSelectBtn = YES; // 一直展示选择按钮,防止最大可选图片为1时,三方库内部会隐藏选择按钮 imagePickerVc.allowPickingVideo = NO; // 不能选择视频 imagePickerVc.allowTakePicture = NO; // 内部拍照按钮隐藏 [self presentViewController:imagePickerVc animated:YES completion:nil];

回调: // 返回选择的图片

我用的测机是: 6plus 10.3.2
5s 11.0.1

线上我们有用户crash:

0. Crashed: com.apple.batchFetchingArray

0 libsystem_kernel.dylib 0x196a4f270 pthread_kill + 8 1 libsystem_pthread.dylib 0x196aed228 pthread_kill + 112 2 libsystem_c.dylib 0x1969c6b18 abort + 112 3 libsystem_malloc.dylib 0x196a8a3e4 _nano_malloc_check_clear + 318 4 libsystem_malloc.dylib 0x196a892f8 nano_free + 192 5 CoreFoundation 0x185a56220 _CFArrayReplaceValues + 1152 6 CoreFoundation 0x185a55d5c CFArrayAppendValue + 164 7 Photos 0x1899d4aa4 66-[PHBatchFetchingArray countByEnumeratingWithState:objects:count:]_block_invoke + 88 8 libdispatch.dylib 0x19690d36c _dispatch_client_callout + 16 9 libdispatch.dylib 0x1969166e8 _dispatch_barrier_sync_f_invoke + 76 10 Photos 0x1899d49ec -[PHBatchFetchingArray countByEnumeratingWithState:objects:count:] + 200 11 CoreFoundation 0x185b6744c __NSArrayEnumerate + 556 12 Photos 0x1899dab60 -[PHFetchResult enumerateObjectsUsingBlock:] + 88 13 teacher 0x100506560 -[TZImageManager getAssetsFromFetchResult:allowPickingVideo:allowPickingImage:completion:] (TZImageManager.m:242) 14 teacher 0x1005024c8 -[TZAlbumModel setResult:] (TZAssetModel.m:38) 15 teacher 0x10050ba98 -[TZImageManager modelWithResult:name:isCameraRoll:] (TZImageManager.m:903) 16 teacher 0x1005055c4 -[TZImageManager getCameraRollAlbum:allowPickingImage:completion:] (TZImageManager.m:141) 17 teacher 0x10050ee48 -[TZImagePickerController pushPhotoPickerVc] (TZImagePickerController.m:304) 18 teacher 0x10050d8b0 -[TZImagePickerController initWithMaxImagesCount:columnNumber:delegate:pushPhotoPickerVc:] (TZImagePickerController.m:197) 19 teacher 0x1002c63b8 -[AssignHomeworkView actionSheet:clickedButtonAtIndex:] (AssignHomeworkView.m:639) 20 UIKit 0x18a8dda54 -[UIActionSheet _prepareToDismissForTappedIndex:] + 200 21 UIKit 0x18a8dd960 37-[UIActionSheet _prepareAlertActions]_block_invoke114 + 48 22 UIKit 0x18a6f0c40 -[UIAlertController _dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:] + 104 23 UIKit 0x18a318750 _UIGestureRecognizerUpdate + 8536 24 UIKit 0x18a3528dc -[UIWindow _sendGesturesForEvent:] + 1044 25 UIKit 0x18a351f7c -[UIWindow sendEvent:] + 660 26 UIKit 0x18a32568c -[UIApplication sendEvent:] + 264 27 UIKit 0x18a5c460c _UIApplicationHandleEventFromQueueEvent + 14992 28 UIKit 0x18a323bf4 _UIApplicationHandleEventQueue + 1616 29 CoreFoundation 0x185b2e9ec CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 24 30 CoreFoundation 0x185b2dc90 CFRunLoopDoSources0 + 264 31 CoreFoundation 0x185b2bd40 __CFRunLoopRun + 712 32 CoreFoundation 0x185a590a4 CFRunLoopRunSpecific + 396 33 GraphicsServices 0x18ebf35a4 GSEventRunModal + 168 34 UIKit 0x18a38aaa4 UIApplicationMain + 1488 35 teacher 0x100446118 main (main.m:14) 36 libdyld.dylib 0x196936a08 start + 4

崩溃是用户的内存: 1 \ 12:46:47:991 (UTC) \ !!! Memory warning !!!, 当前时间:2018-03-04 20:46:65 totalMemory:975.57 MB availableMemory:98.08 MB usedMemory:25.01 MB 设备型号:iPhone
2 | 13:01:16:832 (UTC) | !!! Memory warning !!!, 当前时间:2018-03-04 21:01:71 totalMemory:975.57 MB availableMemory:119.36 MB usedMemory:38.63 MB 设备型号:iPhone

崩溃用户的设备及系统: 6plus 8.1.3

banchichen commented 6 years ago

你好,可以使用 MLeaksFinder:https://github.com/Tencent/MLeaksFinder 检测下应用里的内存泄露,TZImagePickerController内部的处理目前无法再优化了,目前所有功能都没有内存泄露(可以用instruments检测),内存飙到975M应该不是TZImagePickerController引起的,只是正好用户在内存很高的时候去选择照片了,崩溃堆栈显示用户是刚到照片列表页,我在Demo里5000张照片的获取和展示内存只涨了11M,建议先去排查其它地方。