美文网首页
iOS--题目

iOS--题目

作者: mayuee | 来源:发表于2020-07-20 18:20 被阅读0次

    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”的显示位置。

    参考链接frame和bounds的区别 - 简书

    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的相应事件。

    相关文章

      网友评论

          本文标题:iOS--题目

          本文链接:https://www.haomeiwen.com/subject/hyyjhktx.html