iOS面试题之一

2021-07-22  本文已影响0人  经天纬地

from 逻辑教育

第一部分:iOS面试题(上)

1: 谈谈你对KVC的理解
2: iOS项目中引用多个第三方库引发冲突的解决方法
3: GCD实现多读单写
4: 讲一下atomic的实现机制;为什么不能保证绝对的线程安全?
5: Autoreleasepool所使用的数据结构是什么?
6: AutoreleasePoolPage结构体了解么?
7: iOS中内省的几个方法?
8: class方法和objc_getClass方法有什么区别?
9: 分类和扩展有什么区别?可以分别用来做什么?
10: 分类有哪些局限性?分类的结构体里面有哪些成员?
11: 能不能简述一下Dealloc的实现机制

第二部分:iOS面试题(中)

12: HTTPS和HTTP的区别
13: TCP为什么要三次握手,四次挥手?
14: 对称加密和非对称加密的区别?分别有哪些算法的实现?
15: HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?
16: 如何用Charles抓HTTPS的包?其中原理和流程是什么?
17: 什么是中间人攻击?如何避免?
18: 了解编译的过程么?分为哪几个步骤?
19: 静态链接了解么?静态库和动态库的区别?
20: App网络层有哪些优化策略?
21: 排序题︰冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些?
22: iOS开发中的加密方式
23: App安全,数字签名,App签名,重签名

第三部分:iOS面试题(下)

24: OC数据类型
25: property和属性修饰符
26: 成员变量ivar和属性property的区别,以及不同关键字的作用
27: 类簇的优缺点
28: 谈谈设计模式
29: 谈谈架构设计
30: ReactiveCocoa的使用及优缺点
31: 类的继承,类能否多继承,协议能不能做继承?
32: 分类(category)和类扩展(extension)的区别
33: 如何实现week
34: 字典注意事项:setvalue和setobject的区别
35: 多线程和锁
36: WebSocket与TCP Socket的区别
37: 事件传递和响应机制


以下答案为本人自己查找资料整理回答

答案:

第一部分:

1: 谈谈你对KVC的理解

答:key-value- coding 键值编码,通过属性字符串名称访问或修改属性机制,api为:valueForKey: 、 setValue:、 valueForKeyPath: 、setValue:

setValue原理为:
image.png
valueForKey原理为:
image.png
2: iOS项目中引用多个第三方库引发冲突的解决方法

答:表现为编译报dumplicate symbols错误。
解决方式
一、使用命令将 .a 库中相同的包
二、在编译链接项中添加-dead_strip项

一、使用命令将 .a 库中相同的包

1、创建临时文件夹,用于存放armv7平台解压后的.o文件:mkdir armv7

2、取出armv7平台的包:lipo libx.a -thin armv7 -output armv7/libx-armv7.a

3、查看库中所包含的文件列表:ar -t armv7/libx-armv7.a

4、解压出object file(即.o后缀文件):cd armv7 && ar xv libx-armv7.a

5、找到冲突的包(AFHTTPSessionManager),删除掉rm AFHTTPSessionManager.o

6、重新打包object file:cd .. && ar rcs libx-armv7.a armv7/*.o,可以再次使用[2]中命令确认是否已成功将文件去除

7、将其他几个平台(armv7s, i386, arm64, x86_64)包逐一做上述[1-6]操作

8、重新合并为fat file的.a文件:
lipo -create libx-armv7.a libx-armv7s.a libx-i386.a -output libSDK-new.a

9、拷贝到项目中覆盖源文件:
cp libSDK-new.a /Users/tony/Desktop/XXXProject/Lib/libSDK.a
解决二
二、在编译链接项中添加-dead_strip项
在Build Settings->Other link flags中添加-dead_strip,如果Other link flags中有-all_load与-force_load则删掉,只填-dead_strip

3: GCD实现多读单写
- (void)viewDidLoad {
    [super viewDidLoad];
    
    _syncQueue = dispatch_queue_create("ioQueue", DISPATCH_QUEUE_CONCURRENT);
        for (int i = 0; i < 100; i ++) {
            [self setSomeString:[NSString stringWithFormat:@"%d",i]];
            NSLog(@"someString:%@",[self someString]);
        }
   
}

-(NSString *)someString {
    
    __block NSString *localSomeString;
    dispatch_sync(_syncQueue, ^{
        sleep(1);
        localSomeString = self.string;
    });
    
    return localSomeString;
    
}

- (void)setSomeString:(NSString *)someString {
    
    dispatch_barrier_async(_syncQueue, ^{
        sleep(1);
        self.string = someString;
    });
}
4: 讲一下atomic的实现机制;为什么不能保证绝对的线程安

全?
答:

  1. atomic用于保证属性setter、getter的原子性操作,相当于在getter和setter内部加了线程同步的锁
  2. 这个锁只能保证单独的读或者单独的写诗线程安全,如果同时读和写,就不是线程安全。
  3. 解决的方法就是读和写用同一把锁。

5: Autoreleasepool所使用的数据结构是什么?

答:双向链表

6: AutoreleasePoolPage结构体了解么?
image.png
7: iOS中内省的几个方法?

答:四个方法,判断类,判断方法

-(BOOL) isKindOfClass:            判断是否是这个类或者这个类的子类的实例
-(BOOL) isMemberOfClass:      判断是否是这个类的实例

-(BOOL) respondsToSelector:                      判读实例是否有这样方法
+(BOOL) instancesRespondToSelector:      判断类是否有这个方法
8: class方法和objc_getClass方法有什么区别?

答:
1.object_getClass(obj)
返回的是obj的isa指针;

  1. [obj class]
    obj为实例对象
    调用的是实例方法:- (Class)class,返回的obj对象中的isa指针;
    obj为类对象(包括元类和根类以及根元类)
    调用的是类方法:+ (Class)class,返回的结果为调用者本身。
    再回顾一下经典图:


    image.png
9: 分类和扩展有什么区别?可以分别用来做什么?
  1. Class Extension在编译的时候,它的数据就已经包含在类信息中
  2. Category是在运行时,才会将数据合并到类信息中
  3. 扩展作用:为一个类添加额外的原来没有变量,方法和属性
    一般的类扩展写到.m文件中
    一般的私有属性写到.m文件中的类扩展中

10: 分类有哪些局限性?分类的结构体里面有哪些成员?

答:不能直接添加属性,需要通过Runtime动态添加get、set方法达到添加属性目的,注意,只能通过get、set方法获取,不能通过成员变量获取,除非用runtime添加成员变量。

struct category_t {
    const char *name;
    classref_t cls;
    WrappedPtr<method_list_t, PtrauthStrip> instanceMethods;
    WrappedPtr<method_list_t, PtrauthStrip> classMethods;
    struct protocol_list_t *protocols;
    struct property_list_t *instanceProperties;
    // Fields below this point are not always present on disk.
    struct property_list_t *_classProperties;

    method_list_t *methodsForMeta(bool isMeta) {
        if (isMeta) return classMethods;
        else return instanceMethods;
    }

    property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
    
    protocol_list_t *protocolsForMeta(bool isMeta) {
        if (isMeta) return nullptr;
        else return protocols;
    }
};
11: 能不能简述一下Dealloc的实现机制

答:

  1. dealloc
  2. _objc_rootDealloc
  3. rootDealloc
  4. object_dispose
  5. objc_destructInstance、free

第二部分:

12: HTTPS和HTTP的区别

答:

13: TCP为什么要三次握手,四次挥手?

答:为了确保TCP正确地建立连接和断开连接
详情请看: 这一次,彻底搞懂TCP3次握手、4次挥手好吗?

14: 对称加密和非对称加密的区别?分别有哪些算法的实现?

答:

  1. 对称加密:使用同一个秘钥,非对称加密使用2把密钥加密和解密,即公钥、私钥
  2. 常见的加密方式:
    1. 不可逆
      • 单向散列函数:MD5、SHA
    2. 可逆
      • 对称加密:DES、3DES、AES
      • 非对称加密:RSA
    3. 其他
      • 混合密码系统
      • 数字签名
      • 证书
15: HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?

答:

16: 如何用Charles抓HTTPS的包?其中原理和流程是什么?

答:客户端安装证书。原理就是利用代理网络对客户端的网络请求进行代理转发。

17: 什么是中间人攻击?如何避免?

答:

18: 了解编译的过程么?分为哪几个步骤?
19: 静态链接了解么?静态库和动态库的区别?

答:

20: App网络层有哪些优化策略?

1、优化DNS解析和缓存
2、网络质量检测(根据网络质量来改变策略)
3、提供网络服务优先级和依赖机制
4、提供网络服务重发机制
5、减少数据传输量
6、优化海外网络性能
7、购买配置CDN网络加速服务

21: 排序题︰冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些?
22: iOS开发中的加密方式
23: App安全,数字签名,App签名,重签名

第三部分

24: OC数据类型

25: property和属性修饰符

26: 成员变量ivar和属性property的区别,以及不同关键字的作用
27: 类簇的优缺点

优点:

缺点=

28: 谈谈设计模式
29: 谈谈架构设计
30: ReactiveCocoa的使用及优缺点
31: 类的继承,类能否多继承,协议能不能做继承?

不能

32: 分类(category)和类扩展(extension)的区别

33: weak实现原理
  1. weak的原理在于底层维护了一张weak_table_t结构的hash表,key是所指对象的地址,value是weak指针的地址数组。
  2. weak 关键字的作用是弱引用,所引用对象的计数器不会加1,并在引用对象被释放的时候自动被设置为 nil。
  3. 对象释放时,调用clearDeallocating函数根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。
  4. SideTable、weak_table_t、weak_entry_t这样三个结构,它们之间的关系如下图所示。


    image.png
34: 字典注意事项:setvalue和setobject的区别

setvalue需要注意对象为nil情况,为nil会导致崩溃,setobject不会

35: 多线程和锁
36: WebSocket与TCP Socket的区别
37: 事件传递和响应机制
  1. 事件的产生
  1. 事件的传递
上一篇下一篇

猜你喜欢

热点阅读