iOS: fix memory leak
This commit is contained in:
parent
37197a8f45
commit
e55b64158c
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user