NSAttributedString装载图片与UIImageView装载图片对比

来源:互联网 发布:win7共享输入网络密码 编辑:程序博客网 时间:2024/04/28 10:56

一、先简单介绍一下NSAttributedString如何装载图片:
NSAttributedString有一个类方法attributedStringWithAttachment:参数是NSTextAttachment,NSTextAttachment有一个叫做image的属性。所以自然就可以将一张图片插入到NSAttributedString中然后赋值给UILabel的attributedText。
示例代码如下:

NSTextAttachment *attachment = [[NSTextAttachment alloc] init];attachment.image = [UIImage imageNamed:@"test.png"];attachment.bounds = CGRectMake(0, 0, 100, 100);NSAttributedString *attributed = [NSAttributedString attributedStringWithAttachment:attachment];UILabel *label = [[UILabel alloc] init];label.numberOfLines = 0;label.attributedText = attributed;

这种方式可以方便的做图文混排。以及图文混编。笔者就用这种方式自定义了一个可以加入图片的TextView。

二、分析NSAttributedString与UIImageView装载图片的对比。

测试条件:

  1. 24张图片
  2. 图片高度
  3. 用NSAttributedString与UIImageView装载同样张数的图片做内存对比

测试过程:

写两个方法,分别是用NSAttributedString和UIImageView装载相同的图片,图片高度一样,然后做内存分析。

测试结果:

  1. 当kImageHeight=10的时候,NSAttributedString的内存截图是:
    这里写图片描述
    UIImageView的内存截图是:
    这里写图片描述
    从以上两个图可以看出,NSAttributedString完胜UIImageView。

  2. 当kImageHeight = 400的时候,NSAttributedString的内存截图是:
    这里写图片描述
    UIImageView的内存截图是:
    这里写图片描述

  3. 当kImageHeight = 1000的时候,NSAttributedString的内存截图是:
    这里写图片描述
    UIImageView的内存截图是:
    这里写图片描述

从以上测试结果可以看出,无论图片多大,UIImageView加载同样张数的图片,内存一直是25M左右,上下浮动也只有1M左右。而NSAttributedString所占内存与图片大小成正比,当图片高度只有10的时候,内存只有4M左右、当图片增到1000的时候,内存随之飙升到120M以上。

对比结果:

通过以上测试和分析。我们可以知道。UIImageView加载图片的内存,并不会随着图片增大而增大。事实上,UIImage的size是不可改变的,在UIImageView上拉大图片只是拉大UIImageView的frame,所以UIImageView的内存在图片确定的情况下,是不会随着UIImageView的frame改变而改变。相反,NSAttributedString所占用的内存却是和图片大小成正比。
图片较小的情况下,优先选择NSAttributedString,可以节省一部分内存,图片大的时候,应该选择UIImageView,不然内存会飙升,很容易收到内存警告

点击下载相关Demo代码

0 0