1、UIView/CALayer关系,为什么两者没有合并
继承关系:
* UIView -----> UIResponder -----> NSObject
* CALayer -----> NSObject
UIView为CALayer提供内容,可以接受并处理事件,参与响应链,而 CALayer 不可以。
CALayer负责显示内容contents;
UIView初始化的时候默认会创建一个layer,UIView负责管理 layer,为 layer 提供内容,UIView 是 layer 的 CALayerDelegate。CALayer是实际的图层内容管理者,提供内容contents的渲染和显示,并且 UIView 的尺寸样式都由内部的 CALayer 提供。
CALayer 默认修改属性支持隐式动画,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer 通过 actionForLayer:forKey:向 View请求相应的 action(动画行为);
为什么两者没有合并:
单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。通俗地讲就是一个类只做一件事。所以CALayer只负责动画和视图的显示;UIView只负责事件传递、事件响应。
2、frame和bounds区别
frame: 当前视图在父视图坐标系中的位置和大小。参照点是,父亲的坐标系统。
bounds:视图在本身坐标系中的位置和大小。参照点是,本身坐标系统,就相当于视图自己的坐标系统,以(0,0)点为原点。
设置bounds可以修改自己坐标系的原点位置,进而影响到其“子view”的显示位置。
3、静态方法是否能被重写
@interface Animal : NSObject
+ (void)run;
@end
@implementation Animal
+ (void)run
{
NSLog(@"Animal run!");
}
@interface Cat : Animal
@end
@implementation Cat
+ (void)run
{
NSLog(@"Cat run!");
}
[Cat run];
2020-07-20 16:59:01.315627+0800 Test[15784:292301] Cat run!
代码实测,静态方法是可以被重写
1.实例方法/动态方法
a).标识符:-
b).调用方式:[实例对象 函数];
c).实例方法在堆栈上。
2.静态方法/类方法
a).标识符:+
b).调用方式:[类 函数]
c).静态方法在堆上分配内存。
3.静态方法和实例方法的区分
a).静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类第一次被使用时加载。调用的速度基本上没有差别。
b).静态方法在堆上分配内存,实例方法在栈上。事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个区域是不可写的。
c).静态方法是通过类名直接访问,实例方法是通过类的实例访问。
d).静态方法是静态绑定到子类,不是被继承。
e).一般使用频繁的方法用静态方法,用的少的方法用动态的。静态的速度快,占内存。动态的速度相对慢些,但调用完后,立即释放类,可以节省内存,可以根据自己的需要选择是用动态方法还是静态方法。
f).静态方法修改的是类的状态,而对象修改的是各个对象的状态。
g).类的实例调用是在类的生命周期中存在,当类没有了以后,对应的实例也就没有了,对应的方法也就没有了。静态类是只要你引用了那个静态类的命名空间,它就会一直存在,直到我们退出系统。
4、#import跟 #include 有什么区别,@class呢,#import<> 跟 #import””有什么区别?
1). #import
是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入。
2). @class
告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。
3). #import<>
用来包含系统的头文件,#import””用来包含用户头文件。
5、UIView的alpha、hidden和opaque属性之间的关系和区别
UIView中alpha是一个浮点值,取值范围0~1.0,表示从完全透明到完全不透明,默认值是1.0。hidden属性为BOOL值,用来表示UIView是否隐藏,默认值是NO。opaque属性为BOOL值,UIView的默认值是YES,但UIButton等子类的默认值都是NO。opaque表示当前UIView是否不透明,但决定不了当前UIView是不是不透明,比如你将opaque设为NO,该UIView照样是可见的(是否可见是由alpha或hidden属性决定的)。
设置UIView的hidden、alpha和opaque都可以使得UIView变透明,hidden和alpha属性会影响到UIView的子视图,使得子视图也隐藏,当alpha=0或hidden=YES时,当前的UIView和子视图都会被隐藏,当前UIView会从响应者链中移除,而响应者链中的下一个会成为第一响应者。而设置UIView的opaque不会影响UIView的子视图也不会影响UIView的相应事件。
网友评论