- 两个坑都是用户点击过快才会触发。
- 同一时刻多次调用delegate 的imagePickerController:didFinishPickingMediaWithInfo:
时导致 _arguments 被设置为nil 层层传递到CFRelease(cgImage) crash
+ (NSData *)updateMetaData:(NSDictionary *)metaData toImage:(NSData *)imageData {
NSMutableData *mutableData = [NSMutableData data];
CGImageSourceRef cgImage = CGImageSourceCreateWithData((__bridge CFDataRef)imageData, NULL);
CGImageDestinationRef destination = CGImageDestinationCreateWithData(
(__bridge CFMutableDataRef)mutableData, CGImageSourceGetType(cgImage), 1, nil);
CGImageDestinationAddImageFromSource(destination, cgImage, 0, (__bridge CFDictionaryRef)metaData);
CGImageDestinationFinalize(destination);
CFRelease(cgImage);
CFRelease(destination);
return mutableData;
}
- 用户多次触发channel调用,导致self.result 设置成nil。然后用户cancel时调用imagePickerControllerDidCancel时 调用self.result未做保护导致crash
- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
if (self.result) {
self.result([FlutterError errorWithCode:@"multiple_request"
message:@"Cancelled by a second request"
details:nil]);
self.result = nil;
}
//略...
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[_imagePickerController dismissViewControllerAnimated:YES completion:nil];
self.result(nil);
self.result = nil;
_arguments = nil;
}
相关issue https://github.com/flutter/flutter/issues/42305#issuecomment-539896119
网友评论