利用运行时,给UIImageView写一个分类,交换里面的setImage的方法,可以重绘图片,提高内存的利用率(要是没有重绘图片,直接使用系统提供的setImag就会造成占用大量的内存问题)

来源:互联网 发布:linux系统jdk下载官网 编辑:程序博客网 时间:2024/05/16 09:38
//在类被加载到运行时的时候,就会执行
+ (
void)load {
   
   
// 1.获取 UIImageView类的实例方法 `setImage:`
   
Method originalMethod =class_getInstanceMethod([selfclass],@selector(setImage:));
   
// 2.获取 UIImageView类的实例方法 `cz_setImage:`,本身定义在分类中
   
Method swizzledMethod =class_getInstanceMethod([selfclass],@selector(cz_setImage:));

   
// 3.交换方法 setImage cz_setImage,交换完成之后
   
// 1>调用 setImage相当于调用 cz_setImage
   
// 2>调用 cz_setImage相当于调用 setImage
   
method_exchangeImplementations(originalMethod, swizzledMethod);
}

///  1.当在其他位置调用 `setImage`方法时,`自动`调用 cz_setImage: 方法
- (
void)cz_setImage:(UIImage *)image {
   
NSLog(@"%s %@", __FUNCTION__, image);
   
   
// 1.根据 imageView的大小,重新调整 image的大小
   
//使用 `CG`重新生成一张和目标尺寸相同的图片
   
UIGraphicsBeginImageContextWithOptions(self.bounds.size,YES,0);
   
   
//绘制图像
    [image
drawInRect:self.bounds];
   
   
//取得结果
   
UIImage *result =UIGraphicsGetImageFromCurrentImageContext();
   
   
//关闭上下文
   
UIGraphicsEndImageContext();
   
   
//调用系统默认的 setImage方法
    [
selfcz_setImage:result];
}
0 0
原创粉丝点击