iOS: fix memory leak

This commit is contained in:
pengfei.zhou 2022-02-21 14:53:14 +08:00 committed by osborn
parent 37197a8f45
commit e55b64158c
2 changed files with 12 additions and 13 deletions

View File

@ -26,14 +26,14 @@ - (void)getImageInfo:(NSDictionary *)resource withPromise:(DoricPromise *)promis
DoricResource *doricResource = [self.doricContext.driver.registry.loaderManager load:resource withContext:self.doricContext]; DoricResource *doricResource = [self.doricContext.driver.registry.loaderManager load:resource withContext:self.doricContext];
if (doricResource != nil) { if (doricResource != nil) {
DoricAsyncResult *asyncResult = [doricResource fetch]; DoricAsyncResult *asyncResult = [doricResource fetch];
[asyncResult setResultCallback:^(id _Nonnull result) { [asyncResult setResultCallback:^(id _Nonnull result) {
UIImage *image = [UIImage imageWithData:result]; UIImage *image = [UIImage imageWithData:result];
[promise resolve:@{ [promise resolve:@{
@"width": @(image.size.width), @"width": @(image.size.width),
@"height": @(image.size.height) @"height": @(image.size.height)
}]; }];
}]; }];
[asyncResult setExceptionCallback:^(NSException * _Nonnull e) { [asyncResult setExceptionCallback:^(NSException *_Nonnull e) {
DoricLog(@"Cannot load resource %s, %s", resource.description, e.description); DoricLog(@"Cannot load resource %s, %s", resource.description, e.description);
}]; }];
} else { } else {
@ -46,9 +46,9 @@ - (void)decodeToPixels:(NSDictionary *)resource withPromise:(DoricPromise *)prom
DoricResource *doricResource = [self.doricContext.driver.registry.loaderManager load:resource withContext:self.doricContext]; DoricResource *doricResource = [self.doricContext.driver.registry.loaderManager load:resource withContext:self.doricContext];
if (doricResource != nil) { if (doricResource != nil) {
DoricAsyncResult *asyncResult = [doricResource fetch]; DoricAsyncResult *asyncResult = [doricResource fetch];
[asyncResult setResultCallback:^(id _Nonnull result) { [asyncResult setResultCallback:^(id _Nonnull result) {
UIImage *image = [UIImage imageWithData:result]; UIImage *image = [UIImage imageWithData:result];
CGImageRef imageRef = image.CGImage; CGImageRef imageRef = image.CGImage;
NSUInteger iWidth = CGImageGetWidth(imageRef); NSUInteger iWidth = CGImageGetWidth(imageRef);
NSUInteger iHeight = CGImageGetHeight(imageRef); NSUInteger iHeight = CGImageGetHeight(imageRef);
@ -56,20 +56,19 @@ - (void)decodeToPixels:(NSDictionary *)resource withPromise:(DoricPromise *)prom
NSUInteger iBytesPerRow = iBytesPerPixel * iWidth; NSUInteger iBytesPerRow = iBytesPerPixel * iWidth;
NSUInteger iBitsPerComponent = 8; NSUInteger iBitsPerComponent = 8;
unsigned char *imageBytes = malloc(iWidth * iHeight * iBytesPerPixel); unsigned char *imageBytes = malloc(iWidth * iHeight * iBytesPerPixel);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(imageBytes, iWidth, iHeight, iBitsPerComponent, iBytesPerRow, colorspace, kCGImageAlphaPremultipliedLast); CGContextRef context = CGBitmapContextCreate(imageBytes, iWidth, iHeight, iBitsPerComponent, iBytesPerRow, colorspace, kCGImageAlphaPremultipliedLast);
CGRect rect = CGRectMake(0, 0, iWidth, iHeight); CGRect rect = CGRectMake(0, 0, iWidth, iHeight);
CGContextDrawImage(context, rect, imageRef); CGContextDrawImage(context, rect, imageRef);
CGColorSpaceRelease(colorspace); CGColorSpaceRelease(colorspace);
CGContextRelease(context); CGContextRelease(context);
NSData* data = [NSData dataWithBytes:(const void *)imageBytes length:sizeof(unsigned char) * iWidth * iHeight * iBytesPerPixel]; NSData *data = [NSData dataWithBytesNoCopy:(void *) imageBytes length:sizeof(unsigned char) * iWidth * iHeight * iBytesPerPixel freeWhenDone:YES];
[promise resolve:data]; [promise resolve:data];
}]; }];
[asyncResult setExceptionCallback:^(NSException * _Nonnull e) { [asyncResult setExceptionCallback:^(NSException *_Nonnull e) {
DoricLog(@"Cannot load resource %s, %s", resource.description, e.description); DoricLog(@"Cannot load resource %s, %s", resource.description, e.description);
}]; }];
} else { } else {

View File

@ -761,7 +761,7 @@ - (NSData *)getImagePixels {
CGColorSpaceRelease(colorSpace); CGColorSpaceRelease(colorSpace);
CGContextRelease(contextRef); CGContextRelease(contextRef);
return [[NSData alloc] initWithBytesNoCopy:imageData length:width * height * bytesPerPixel]; return [[NSData alloc] initWithBytesNoCopy:imageData length:width * height * bytesPerPixel freeWhenDone:YES];
} }
- (void)dealloc { - (void)dealloc {