一、先简单介绍一下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装载图片的对比。
测试条件:
- 24张图片
- 图片高度
- 用NSAttributedString与UIImageView装载同样张数的图片做内存对比
测试过程:
写两个方法,分别是用NSAttributedString和UIImageView装载相同的图片,图片高度一样,然后做内存分析。
测试结果:
当kImageHeight=10的时候,NSAttributedString的内存截图是:
UIImageView的内存截图是:
从以上两个图可以看出,NSAttributedString完胜UIImageView。当kImageHeight = 400的时候,NSAttributedString的内存截图是:
UIImageView的内存截图是:
当kImageHeight = 1000的时候,NSAttributedString的内存截图是:
UIImageView的内存截图是:
从以上测试结果可以看出,无论图片多大,UIImageView加载同样张数的图片,内存一直是25M左右,上下浮动也只有1M左右。而NSAttributedString所占内存与图片大小成正比,当图片高度只有10的时候,内存只有4M左右、当图片增到1000的时候,内存随之飙升到120M以上。
对比结果:
通过以上测试和分析。我们可以知道。UIImageView加载图片的内存,并不会随着图片增大而增大。事实上,UIImage的size是不可改变的,在UIImageView上拉大图片只是拉大UIImageView的frame,所以UIImageView的内存在图片确定的情况下,是不会随着UIImageView的frame改变而改变。相反,NSAttributedString所占用的内存却是和图片大小成正比。
图片较小的情况下,优先选择NSAttributedString,可以节省一部分内存,图片大的时候,应该选择UIImageView,不然内存会飙升,很容易收到内存警告