iOS(OC)面试小整理

2021-03-08  本文已影响0人  iOS鑫

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是大牛还是小白都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

1.OOP 编程思想

Object Oriented Programming(面向对象编程) 这种思想把一切看为对象,把现实中的事物及关系抽象成对象,使我们将处理现实中的实际问题简化为处理各种对象之间的问题

面向对象的三大特性

2.SOLID 设计原则

3.属性关键字

4.深拷贝、浅拷贝

Q:NSString 为什么用 copy 修饰?用 strong 会有问题么?

A:保证其安全性

因为如果用 strong 修饰,在进行 setter 时,传进来的是一个NSMutableString 也是可以赋值的(这里也有多态的体现),但是如果 NSMutableString 发生变化的话,由于是 strong 修饰, NSString 的那个对象也会发生变化且无感知,这种风险就存在了,而如果用 copy 修饰,在 setter 时,如果传进来的不可变对象 NSString,那么 copy 为浅拷贝,如果传进来的是可变对象 NSMutableString,那么 copy 为深拷贝且 copy 出来的这个新对象变为了不可变的对象

5.事件传递 & 响应链

事件传递:当一个事件产生比如说一个点击事件,首先就要寻找最佳响应者,配合下面这两个方法,找到最佳响应者之后,UIApplication发送事件给UIWindow,UIWindow发送事件给最佳响应者

- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;   // default returns YES if point is in bounds

响应链:如果最佳响应者可以处理这个事件,那就响应结束,如果不能响应事件则通过 nextResponder 传递给下一个响应者,如果传递到UIApplication还是不能响应则丢弃该事件

6.UI 卡顿掉帧的原因

当 FPS 低于 60 的时候,肉眼就会感到卡顿

所以每一帧绘制的时间需要小于 1000ms / 60 ≈ 16.7ms 才不会感觉到卡顿

系统生成图像信号是靠 CPU + GPU 共同工作的,所以优化的话也是从这两方面入手考虑

7. block 相关

概念

block捕获变量特性

在block中使用外部变量时,block会捕获其变量,具体规则如下

__block

使用场景:在blcok内部对捕获的值进行赋值

8. OC 开发中碰到的设计模式

9.Runtime

概念:

Objective-C 扩展了 C 语言,并加入了面向对象特性和消息传递机制,而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。

isa 指针(一图胜千言)

image

消息传递机制:(一图胜千言)

image

消息转发机制:(一图胜千言)

image

使用场景:

10.RunLoop

概念:

通过内部维护的事件循环来对事件、消息进行管理的一个对象 没有消息的时候休眠以避免资源占用(用户态转为内核态),有消息时立即被唤醒(内核态转为用户态)

作用

其他

RunLoop in cocoa

11.多线程相关

相关概念

队列:负责任务的调度 线程:负责任务的执行

// OC 中涉及的队列
dispatch_queue_t _cocurrentQueue;
dispatch_queue_t _globalCocurrentQueue;
dispatch_queue_t _serialQueue;
dispatch_queue_t _mainQueue;  

串行队列

_serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
_mainQueue = dispatch_get_main_queue();

并行队列

_cocurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
_globalCocurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

系统提供的并行队列优先级

#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

小红书面试题:有5个任务,要求前三个任务顺序执行,4、5两个任务并行执行,并在5个任务都执行结束后执行其他

{
    dispatch_queue_t global_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, global_queue, ^{
        dispatch_sync(global_queue, ^{
            sleep(5);
            NSLog(@"1 %@",[NSThread currentThread]);
        });
        dispatch_sync(global_queue, ^{
            sleep(3);
            NSLog(@"2 %@",[NSThread currentThread]);
        });
        dispatch_sync(global_queue, ^{
            sleep(1);
            NSLog(@"3 %@",[NSThread currentThread]);
        });
    });

    dispatch_group_async(group, global_queue, ^{
        NSLog(@"4 %@",[NSThread currentThread]);
    });

    dispatch_group_async(group, global_queue, ^{
        NSLog(@"5 %@",[NSThread currentThread]);
    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@"三个任务都执行完毕后执行");
    });
}

执行结果:

image

携程面试题:在用户登录结束后,并行执行用户的操作

{
    dispatch_sync(_globalCocurrentQueue, ^{
        NSLog(@"登录");
    });

    dispatch_async(_globalCocurrentQueue, ^{
        NSLog(@"下载攻略");
    });

    dispatch_async(_globalCocurrentQueue, ^{
        NSLog(@"下载音乐");
    });
}

12.HTTP 请求 get与post 区别

安全的:不引起 server 端任何状态变化 幂等的:同一请求方法执行多次与执行一次效果相同
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是大牛还是小白都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!)

上一篇下一篇

猜你喜欢

热点阅读