//绘图
-(UIImage*)drawImageWithFartherImage:(UIImage*)fImage andChirdImage:(UIImage*)cImage{
CGImageRefimgRef =fImage.CGImage;
size_timgWidth =CGImageGetWidth(imgRef);
size_timgHeight =CGImageGetHeight(imgRef);
CGSizemsize =CGSizeMake(imgWidth, imgHeight);
//绘制图片的大小
UIGraphicsBeginImageContext(msize);
//绘制父本图片
[fImagedrawInRect:CGRectMake(0.0f,0.0f,msize.width,msize.height)];
//绘制子图片(logo)
[cImagedrawInRect:CGRectMake(0,0, msize.width,msize.height*0.8)];
//合成结果
UIImage *resultImage =UIGraphicsGetImageFromCurrentImageContext();
//绘制完成
// CGImageRelease(imgRef);//不需要释放,在这里如果释放了,会造成崩溃
UIGraphicsEndImageContext();
returnresultImage;
}
在CFRelease的解释中,提到要release的对象不能是NULL,若是NULL的话,会引起runtime的错误并且程序将要crash。加之在网上找到的另一种解释是,使用release后,程序并非直接就release了对象,一般都是有延迟的,所以我在第一次调用时表面上是正常的,但到第二次时就崩溃了,可见这个崩溃实际上是第一次的延迟释放对象造成的。而更直接的原因在于CGImageRef对象没有使用creat 或retain ,所以这个CGImageRef对象的内存管理就不需要手动处理了,系统会进行自动的释放,只有当CGImageRef使用creat或retain后才要手动release。去掉CGImageRelease(imageRef)后程序运行正常。
网友评论