从框架来说
- CALayer 基于 QuartzCore 框架
- UIView 基于 UIKit 框架
从父类来说
- 使用CALayer同样可以实现与UIImageView一样的展示效果。那么到底有什么区别呢?
- 其实,CALayer是直接继承自NSObject的,而UIView是直接继承自UIResponder的。
所以、相比于CALayer来说、UIView多了一个事件处理功能、也就是说、CALayer是不能处理用户的触摸事件的、而UIView可以。
那么、当我们展示出来的东西需要实现和用户交互的时候去使用UIView、而不需要的交互的时候CALayer和UIView都可以。
当然、由于CALayer不需要处理交互事件、所以是轻量级的、性能要比UIView高。
代码验证
- (void)viewDidLoad {
[super viewDidLoad];
self.aView = [[UIView alloc] init];
self.aLayer = [[CALayer alloc] init];
//比较UIView对象个CALayer对象在内存中的大小
NSLog(@"self.aView对象实际需要的内存大小: %zd", class_getInstanceSize([self.aView class]));//480
NSLog(@"self.aView对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(self.aView)));//480
NSLog(@"self.aLayer对象实际需要的内存大小: %zd", class_getInstanceSize([self.aLayer class]));//24
NSLog(@"self.aLayer对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(self.aLayer)));//32
NSLog(@"------");
//针对于UILabel 和 CATextLayer内存对比
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(30, 300, 300, 44)];
label.text = @"label";
[self.view addSubview:label];
CATextLayer *textLayer = [[CATextLayer alloc] init];
textLayer.frame = CGRectMake(30, 400, 300, 44);
textLayer.string = @"CATextLayer";
[self.view.layer addSublayer:textLayer];
//比较UILabel对象个CATextLayer对象在内存中的大小
NSLog(@"label对象实际需要的内存大小: %zd", class_getInstanceSize([label class]));//744
NSLog(@"label对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(label)));//752
NSLog(@"textLayer对象实际需要的内存大小: %zd", class_getInstanceSize([textLayer class]));//32
NSLog(@"textLayer对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(textLayer)));//32
NSLog(@"------");
//添加了一些设置, 比如字体大小, 颜色, 换行, 字体长度变化
label.text = @"123456789012345678901234567890";
label.font = [UIFont fontWithName:@"PingFangSC-Regular" size:12];
label.textColor = [UIColor redColor];
textLayer.string = @"123456789012345678901234567890";
textLayer.font = (__bridge CFTypeRef _Nullable)(@"PingFangSC-Regular");
textLayer.fontSize = 12;
textLayer.foregroundColor = [UIColor redColor].CGColor;
//比较UILabel对象个CATextLayer对象在内存中的大小
NSLog(@"label对象实际需要的内存大小: %zd", class_getInstanceSize([label class]));//744
NSLog(@"label对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(label)));//752
NSLog(@"textLayer对象实际需要的内存大小: %zd", class_getInstanceSize([textLayer class]));//32
NSLog(@"textLayer对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(textLayer)));//32
}
打印结果
2019-09-12 11:06:33.017943+0800 Demo[7030:27412457] self.aView对象实际需要的内存大小: 480
2019-09-12 11:06:33.018123+0800 Demo[7030:27412457] self.aView对象实际分配的内存大小: 480
2019-09-12 11:06:33.018249+0800 Demo[7030:27412457] self.aLayer对象实际需要的内存大小: 24
2019-09-12 11:06:33.018367+0800 Demo[7030:27412457] self.aLayer对象实际分配的内存大小: 32
2019-09-12 11:06:33.018478+0800 Demo[7030:27412457] ------
2019-09-12 11:06:33.019261+0800 Demo[7030:27412457] label对象实际需要的内存大小: 744
2019-09-12 11:06:33.019357+0800 Demo[7030:27412457] label对象实际分配的内存大小: 752
2019-09-12 11:06:33.019443+0800 Demo[7030:27412457] textLayer对象实际需要的内存大小: 32
2019-09-12 11:06:33.019542+0800 Demo[7030:27412457] textLayer对象实际分配的内存大小: 32
2019-09-12 11:06:33.019651+0800 Demo[7030:27412457] ------
2019-09-12 11:06:33.023849+0800 Demo[7030:27412457] label对象实际需要的内存大小: 744
2019-09-12 11:06:33.024001+0800 Demo[7030:27412457] label对象实际分配的内存大小: 752
2019-09-12 11:06:33.024106+0800 Demo[7030:27412457] textLayer对象实际需要的内存大小: 32
2019-09-12 11:06:33.085927+0800 Demo[7030:27412457] textLayer对象实际分配的内存大小: 32
- 可以看得出来, 在对象的内存分配中, CATextLayer的内存大小明显要比UIView要轻量的多.
- 对于一些只是用来展示的控件,比如是UIlabel,或者是ImageView. 完全可以用Layer来代替.
简单粗暴来理解 : 所有集成于UIView的控件,它们本身自带了一个CALayer层, 所以UIView里面的东西会比CALayer中的要多.
深入挖掘:
1.UIView和CALayer的坐标系统是一样的吗? Frame和Bounds中的size永远相等吗?
2.创建一个UIView,通过transform改变,比如是旋转30°,翻转45°,x轴缩放一般,改变的是UIView还是CALayer.?
3.对于UILabel与CATextLayer,既然Layer的内存更小,性能更优,为什么都不用CATextLayer,而是经常看到用的是UILabel?
UIView与CALayer的区别,很详细