问题: 请说一下UIView和CALayer有什么关系
图示UIView
里面有个layer
属性, 其实指向的就是CALayer
类型。实际上UIView
的显示部分是由CALayer
的contents
决定的(绘图部分)。例如: UIview的background显示, 其实就是CALayer中contents中backing store显示的位图
-
UIView
: 为其提供内容, 处理触摸等事件,参与响应链
-
CALayer
: 负责显示内容contents
接下来我们看一下开辟内存情况
#import <objc/runtime.h>
#import <malloc/malloc.h>
UIView *v1 = [[UIView alloc] init];
CALayer *c1 = [[CALayer alloc] init];
NSLog(@"v1对象实际需要的内存大小: %zd", class_getInstanceSize([v1 class]));
NSLog(@"v1对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(v1)));
NSLog(@"c1对象实际需要的内存大小: %zd", class_getInstanceSize([c1 class]));
NSLog(@"c1对象实际分配的内存大小: %zd", malloc_size((__bridge const void *)(c1)));
开辟大小
可看出CALayer
的轻量级要比UIView
小很多
我们再看2个例子
Label 例子 Image 例子也可以看出CALayer
量级要小很多, 所以一般的展示, 不涉及响应链情况, 可以用CALayer
来代替UIView
已达到减少内存目的
网友评论