如何在使用 CGImageDestinationFinalize 时避免 malloc
Posted
技术标签:
【中文标题】如何在使用 CGImageDestinationFinalize 时避免 malloc【英文标题】:How to avoid malloc while using CGImageDestinationFinalize 【发布时间】:2014-09-04 02:43:38 【问题描述】:我正在尝试使用以下堆栈的问题以编程方式在 ios 中创建 GIF:
Create and and export an animated gif via iOS?
我的代码如下所示:
// File Parameters
const void *keys[] = kCGImagePropertyGIFLoopCount ;
const void *values[] = (CFNumberRef) 0 ;
CFDictionaryRef params = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL);
const void *keys2[] = kCGImagePropertyGIFDictionary ;
const void *values2[] = (CFDictionaryRef) params ;
CFDictionaryRef fileProperties = CFDictionaryCreate(NULL, keys2 , values2, 1, NULL, NULL);
// URL to the documents directory
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:nil];
NSURL *fileURL = [documentsDirectoryURL URLByAppendingPathComponent:fileName];
// Object that writes GIF to the specified URL
CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)fileURL, kUTTypeGIF, [arrayOfAllFrames count], NULL);
CGImageDestinationSetProperties(destination, fileProperties);
for (NSUInteger i = 0; i < [arrayOfAllFrames count]; i++)
@autoreleasepool
float delayTime = [[gifFramesDuration objectAtIndex:i] floatValue];
NSDictionary *frameProperties = @
(__bridge id)kCGImagePropertyGIFDictionary: @
(__bridge id)kCGImagePropertyGIFDelayTime: [NSNumber numberWithFloat:delayTime] // a float (not double!) in seconds, rounded to centiseconds in the GIF data
;
UIImage *myImage = [arrayOfAllFrames objectAtIndex:i];
CGImageDestinationAddImage(destination, myImage.CGImage, (__bridge CFDictionaryRef)frameProperties);
if (!CGImageDestinationFinalize(destination))
NSLog(@"failed to finalize image destination");
CFRelease(destination);
CFRelease(fileProperties);
CFRelease(params);
但是,一旦我尝试向 GIF 文件添加大约 240 帧,调试器会在调用 CGImageDestinationFinalize 时抛出以下错误:
(923,0xb0115000) malloc: *** error for object 0xd1e7204: incorrect checksum for freed object - object was probably modified after being freed.
能否请您提供一些解决方法,或提供有关如何避免 malloc 的建议?
【问题讨论】:
【参考方案1】:首先,尝试使用 Instruments 调试您的应用。您可能会注意到问题是由以下方法引起的: 从rgbimagewu生成
我一直想知道原因是否在我的线程实现中,但事实证明,一旦出现这种错误,您应该专注于调整 Image 的大小。
图像调整大小后,上面发布的代码将生成您自己的 GIF。
【讨论】:
如何调整图片大小?以上是关于如何在使用 CGImageDestinationFinalize 时避免 malloc的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]