利用运行时,给UIImageView写一个分类,交换里面的setImage的方法,可以重绘图片,提高内存的利用率(要是没有重绘图片,直接使用系统提供的setImag就会造成占用大量的内存问题)
2017-05-01 10:28
1431 查看
//
在类被加载到运行时的时候,就会执行
+ (void)load {
// 1.
获取 UIImageView
类的
实例方法 `setImage:`
Method originalMethod =
class_getInstanceMethod([self
class],
@selector(setImage:));
// 2.
获取 UIImageView
类的
实例方法 `cz_setImage:`,本身定义在分类中
Method swizzledMethod =
class_getInstanceMethod([self
class],
@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
方法
[self
cz_setImage:result];
}
在类被加载到运行时的时候,就会执行
+ (void)load {
// 1.
获取 UIImageView
类的
实例方法 `setImage:`
Method originalMethod =
class_getInstanceMethod([self
class],
@selector(setImage:));
// 2.
获取 UIImageView
类的
实例方法 `cz_setImage:`,本身定义在分类中
Method swizzledMethod =
class_getInstanceMethod([self
class],
@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
方法
[self
cz_setImage:result];
}
相关文章推荐
- 如果系统能够保证不在0x000000007fffffff以上的地址分配内存,那么应用程序就能够正常运行。把一个高33位都为0的64位地址截断为32位地址,无论如何都不会产生问题。系统可以提供这一保证,
- Android Butterknife 8.4.0 ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListene
- 对于bitmap和一些设置图片setImageResource()和setImagebitmap()方法减少内存使用的方法
- ImageView.setImageURI()方法 图片界面不更新问题解决方案
- 0324的学习笔记----里面最重要的就是一个tom猫的动画,和涉及到的内存问题(创建imageview的两种方式,imagenamed就会形成缓存,占用很多内
- 正确的添加图片方法 - 解决UIImageView.image = UIImage(named: String)不显示图像的问题
- 5.0及以上系统上使用CircleImageView圆形头像出现方块背景问题(上一个Activity中的页面)
- Android在打开一个新的Activity浏览大图时使用ImageView/PhotoView的时候图片显示在屏幕上部的问题
- 解决Android ImageView用setImageDrawable方法图片缩小的问题
- 图片拉伸通常我们开发中将其写到UIImage的分类中使用,下面可以直接复制使用
- iOS中 imageNamed方法 非常多图片占用大量内存问题
- iOS中 imageNamed方法 很多图片占用大量内存问题
- Widget中使用ImageView显示图片的问题
- synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包
- XenServer没有自己的文件系统,也就没有自己的ISO Libery,给我们创建虚拟机带来了不少困扰,使用正文这个方法可以不用先安装FileServer
- ios UIImageView添加图片动画效果,添加了手势之后,依然没有反应的解决方法
- 使用RAMDisk制作内存盘加快系统运行速度(并解决部分问题)
- TabHost 两种使用方法 直接让一个Activity 继承TabActivity 和 利用findViwById()方法取得TagHost组件
- ImageView使用和从内存读取图片显示
- Widget中使用ImageView显示图片的问题