Pro*_*ber 5 memory-management core-graphics objective-c ios
使用手动创建CGContextRef时CGBitmapContextCreate()
,是否还必须手动释放位图数据?
现在,我正在这样做:我有一个创建并返回CGContextRef的方法。在该方法内,我还为该上下文创建数据,如下所示:
bitmapData = malloc(bitmapByteCount);
context = CGBitmapContextCreate(bitmapData, ...);
return context;
Run Code Online (Sandbox Code Playgroud)
到现在为止,我一直相信,当此方法的调用者在使用CGContextRef之后简单地释放它时,一切都很好: CGContextRelease(theContext);
从以下文档中CGBitmapContextCreate
:
在iOS 4.0和更高版本以及Mac OS X v10.6和更高版本中,如果希望Quartz为位图分配内存,则可以传递NULL。这使您无需管理自己的内存,从而减少了内存泄漏问题。
这使我认为使用上下文后确实必须释放两件事,这是为我创建的一种便捷方法:释放上下文的位图数据,然后释放上下文本身。
因此,我必须这样做:
void *data = CGBitmapContextGetData(context);
if (data != NULL) {
free(data);
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我不重构所有代码以释放位图数据,而不仅是上下文,我是否会在这里发生大量内存泄漏?
是的。如果你编辑它,你最终必须使用free()
bitmapData (一旦 CGContext 完成绘制等)malloc()
。
请参阅我对您的其他问题的(更正的)答案。
如果您使用 NULL 选项(即,如果您没有使用 malloc()
bitmapData),我希望数据指针在您CGContextRelease()
使用上下文之前一直有效。因此,您要么需要在释放上下文之前对数据执行任何您想要执行的操作,要么将位图数据复制到某处(在这种情况下,您也可以malloc()
事先复制内存并将其传递给上下文)。