iOS 10道细节面试题
最近换工作,已经是有所准备的,但是面试过程中还是很多我觉得比较基础的东西答的不够晚上,怪自己没有深入的思考。下面做个总结:
1. 多线程中NSThread 为什么还存在?
其实面试官想问的是NSThread、GCD、NSOperation 的区别吧
答案:
NSThread
优点:NSThread 轻量级,使用简单,一个thread 对应一个线程
缺点:需要自己管理线程的生命周期,线程同步、加锁、睡眠以及唤醒等
NSOperation
自带线程管理的抽象类。
优点:自带线程周期管理,操作上可更注重自己逻辑。更面向对象,可以自定义,kVO监听 状态
缺点:面向对象的抽象类,只能实现它或者使用它定义好的两个子类
GCD
优点:基于多核的,最高效,避开并发陷阱。
缺点:基于C实现。多线程优先级,线程取消等问题处理比较麻烦
2. SQLite 多线程问题
在不考虑效率的情况下SQLite 其实有三种方式实现
1. 多个线程公用一个数据库链接(不合适)
原因:多个线程之间的同步太麻烦。
2. 每个线程管理自己的数据库链接(不合适)
原因:线程数过多(上百左右个线程发起数据操作)会导致数据库压力大,尤其是有事务操作时会发起很多事务请求,这时所有的带事务请求都会卡在beginTransaction,严重影响性能
3. 串行队列异步的管理多线程(FMDB)
通过实现一个FMDatabaseQueue单例串行队列,其实是CGD实现的
更多关于SQLlite 优化参考
www.cnblogs.com/huozhong/p/…
3. initialize 自类没有实现的情况下,父类initialize会调用几次?
答案是2次,原因是
initialize 原理是 ((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize) 方式
还有一个比较常见的考察是和load 方法对比,详细的就不在这儿描述了
blog.csdn.net/fys_0801/ar…
4. 打印[self class] 和 [super class] 为什么一样
由于都没有重写class方法,所以self 和 super都调用的是基类的class方法,所以结果肯定是一样的,然后[self class]必定是当前实例的类对象也就是ClassB;所以[super class]也是一样的结果
那么问题来了?那为什么[super init] 方法却能调用父类的呢?
原因是
super是用来处理运行时消息转发的边界问题;一般的方法调用都回转成运行时c语言方法:objc_msgSend(id self, SEL cmd, ...)
,然而当遇到super时会调用objc_msgSendSuper
来处理消息,也就是去父类的方法表中中找方法
5. 206 状态码是什么意义
这个问题是考察我的http 基本功,可惜基本功太差,没有答上来,惭愧
正确是:客户发送了一个带有Range头的GET请求,服务器完成了它。断点续传的时候用得到
6. JSPatch 当有5个参数的时候如何处理的
其实前面的时候问JSPatch 原理的时候,我答的还是不错的,当问到这个的时候,我就感觉我前面的努力白费了。技不如人认了。
回来特意看了一下源码,就是这样列举的方式。。。
7.关于NSString的retainCount
NSString 不同的方式,调用retainCount 为什么结果差别那么大
1. 常量的方式
NSString *s = @"test";
NSLog(@"s:%d",[s retainCount]); // -1或2147483647(即UINT_MAX ( Maximum value an `unsigned int')复制代码
2. stringWithFormat 方式
NSString *s = [NSString stringWithFormat:@"%s", "test"];
NSLog(@"s:%d",[s retainCount]); // 1
使用stringWithFormat创建的NSString为变量,系统会进行引用计数复制代码
3. stringWithString
stringWithString这个方法比较特别:它的retainCount取决于它后面跟的string对象
NSString *s1 = [NSString stringWithString:@"test"];
NSString *s2 = [NSString stringWithString:[NSString stringWithFormat:@"test,%d",1]];
NSLog(@"s1:%d",[s1 retainCount]); // 2147483647
NSLog(@"s2:%d",[s2 retainCount]); // 2
复制代码
8. performSelector withObject afterDelay
聪明的你们一定是知道,面试官要问为什么这个方法在自线程中调用正常吗?为什么
1、带有afterDelay参数的方式是使用当前线程的定时器在一定时间后调用SEL,而 performSelector withObject 方式是直接调用SEL。
2、子线程中默认是没有定时器的
解决办法
1. 自线程中开启定时器 [[NSRunLoop currentRunLoop] run];
2. 采用 dispatch_after 方式替换
9. category 属性如何加weak方式
我们都知道category 都用OBJC_ASSOCIATION的方式添加属性,但是并没有weak 方式
我们都知道NSObject 属性可以加weak 属性,那我们就利用它包装一层
具体代码实现参考文章
zhuanlan.zhihu.com/p/33428509
10. 如何判断当前的队列是哪个队列
用到了GCD的一个关键方法 dispatch_queue_get_label
如判断当前队列是否是主队列
#define dispatch_main_async_safe(block)\
if (strcmp(dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL), dispatch_queue_get_label(dispatch_get_main_queue())) == 0)
{ block();
}
else
{ dispatch_async(dispatch_get_main_queue(), block);\
}
#endif复制代码
iOS 10道细节面试题相关推荐
- java builder pool_每周10道Java面试题:String, String Pool, StringBuilder
每周10道 Java 面试题由 ImportNew 整理编译自网络. 1. 写出下面代码的运行结果. int src = 65536; Integer dst = new Integer(65536) ...
- 厉害了,关于String的10道经典面试题
转载自 厉害了,关于String的10道经典面试题 1.String是基本数据类型吗? 2.String是可变的话? 3.怎么比较两个字符串的值一样,怎么比较两个字符串是否同一对象? 4.switch ...
- 稍微有点难度的10道java面试题,你会几道?
转载自 稍微有点难度的10道java面试题,你会几道? 1.jvm对频繁调用的方法做了哪些优化? 2.常见的攻击手段有哪些?如何防范? 3.restful api有哪些设计原则? 4.hessian是 ...
- 10道python面试题,每题10分,你能的多少分!(内附python教程)
image.png 1.一行代码实现1–100之和 10道python面试题,每题10分,你能的多少分! 2.简述面向对象中new和init区别 init是初始化方法,创建对象后,就立刻被默认调用了, ...
- 测试需知的TCP3次握手、4次挥手及10道经典面试题
------·今天距2020年95天·------ 这是ITester小栈第41次推文 大家好,我是coco 小 锦鲤 记得从前 大学计算机组成原理老师给coco讲过 最深刻的一课是搭网线 口诀是这样 ...
- java xml 面试_Java程序员面试常见的10道XML面试题
问题1:XML是什么? 答:XML即可扩展标记语言(Extensible Markup language),你可以根据自己的需要扩展XML, ,而不能使用用户定义的标签.使用DTD和XML Schem ...
- 后端开发10道经典面试题的剖析, 技术方向如何决定职业方向
10道经典面试题的剖析, 技术方向如何决定职业方向 1. time_wait, close_wait如何解决? 2. 服务器接入抖动如何解决? 3. malloc的实现原理 视频讲解如下,点击观看: ...
- 面试java你最擅长什么_面试官最喜欢问的10道Java面试题
1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...
- 盘点苹果2016WWDC精彩看点, iOS 10官方细节要来了
4月19日消息,据国外媒体报道,苹果公司表示今年的全球开发者大会(WWDC)将于6月13日在旧金山正式拉开帷幕,活动一直持续至6月17日. 苹果全球市场营销高级副总裁菲利普·席勒(Philip Sch ...
最新文章
- 解决ajax获取不到按钮的id
- 防止用户将表单重复提交的方法
- feignRequest$Options错误
- java反射机制原理详解_java反射机制的详细讲解
- 树莓派支持uvi协议吗_树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi)...
- 口袋操作系统_全自动阀口袋包装机的发展
- 基于JavaSwing+mysql的图书管理系统设计和实现
- python绘制小狗_用Python画一只有点方的小狗狗——turtle库基础入门
- 面试官问:Java 中的锁有哪些?我跪了……
- Java 容器源码分析之 ArrayList
- 【安装记录】Centos7.6下载安装配置教程(十分详细)
- 身份证前6位匹配户籍地址对应的数据地区sql脚本(里面包含json版本的)
- 提升手机麦克风音量_【奇酷小技巧】教你无需ROOT增大话筒、听筒和外放声音!...
- 查看oracle归档日志scn,Oracle 归档日志
- windows和linux的路径分隔符问题
- Joomla建站之幻灯片
- 谷歌学术、中国知网生成参考文献
- 如何高效录制教学视频?
- python与历史专业_python历史与基本类型
- 黑苹果更改时间命令_黑苹果Mac系统快捷键修改
热门文章
- 入门深度学习,先看看三位顶级大牛Yann LeCun、Yoshua Bengio和Geoffrey Hinton的联合综述
- 爱了!Intellij IDEA 自带的 Vim 插件真心不错
- TDSQL在微众银行的大规模实践之路
- Spring AOP 增强框架 Nepxion Matrix 详解
- 数据缺失、混乱、重复怎么办?最全数据清洗指南!
- 2020新款笔记本送一台!4核+8G+512固态
- 超越BERT的模型有哪些?
- 为什么应届生的身份这么值钱?
- 一篇文章搞懂人脸识别的十个概念
- 女友让我破解植物大战僵尸!我干脆撸了一款一样的....翻身舔狗把歌唱呀