一份"有点难"的iOS面试题

首先声明,本文非原创,是看到MrPeak大大出的题目,内心满怀忐忑的来回答一下.O(∩∩)O哈哈~ 其实好多题目我都不会,甚至有几道题还借助了百度,有几个借助了百度依旧不会~~~~(><)~~~~,看了是要恶补,学习一番了.

1.NSString如何计算字符的个数?
将一个NSString类型字符串获取的长度转换成类似ASCII编码的长度,如汉字2个字节,英文以及符号1个字节这个功能。由于使用[NSString length]方法调用获取的长度是一个中文和一个英文都是一个字节,而使用
[NSString lengthOfBytesUsingEncoding:NSASCIIStringEncoding] 方法无法识别中文编码,真是令人揪心。于是想获得一个char*类型的字符串,然后自己遍历一遍,将它整理为类似ASCII编码的格式,这里要用到[NSString cStringUsingEncoding:NSUnicodeStringEncoding]函数获得一个const char*指针,然后对这个字符串进行遍历,遇/0就跳过,否则length+1,下面是代码,拿出来与大家分享:

-  (int)convertToInt:(NSString*)strtemp {
    int strlength = 0;
    char* p = (char*)[strtemp cStringUsingEncoding:NSUnicodeStringEncoding];
    for (int i=0 ; i<[strtemp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {
        if (*p) {
            p++;
            strlength++;
        }
        else {
            p++;
        }
    }
    return (strlength+1)/2;
}

2.PKI体系当中加密和签名有什么区别?
现在大家的很多重要活动都是通过网络进行的,那么与之俱来的安全问题就显得非常重要。同时很多安全保障机制都是基于PKI的, PKI指的是证明书的制作和分发的一种机制。在这个机制的保障前提下,进行可信赖的网络通信。即安全的网路通信保障机制。
PKI中使用双证书、即双密钥,双密钥是指签名密钥对与加密密钥对,从本质上说,两个密钥对都是非对称密钥对,因此,都可以用来作非对称加解密.数字签名和加密基本原理是什么,具体我就不晓得了~~~~

3.如何自己高效实现NSUserDefault?
数据量一大读取成本就高,敏感数据容易被破解,因为NSUserDefault实际上是明文存在 plist 中的,所以建议用户安全相关的(如 token)尽量不要放在 UserDefault 中,即使要存也最好做一次加密再存,最好的方式是存在 Keychain 中。UserDefault 更适合存一些轻量的数据,如当前版本(可用来做检测更新以及展示欢迎页或其他逻辑)。建议使用 Sqlite 或其他数据存储方式。

4.解释下tcp的慢启动特性。
饿......这个我还真不晓得,百度了也不知所以然,讲的太深奥了,还希望知道的小伙伴用直白的话留言告知😄

5.如何用HTTP实现长连接?/ (HTTP能实现长连接嘛?)
首先,http能实现长连接,是建立在tcp协议的基础上的。但http中,其实没有长连接这样的类型。保持一个tcp连接是长连接。完全是通过程序员手动来控制的。
如果程序员,想让一个http连接,比如该连接叫A,让A成为一个长连接。
那么,就不调用该连接的close()方法。
直到,不再需要A连接的时候,才关闭该连接。
那么,A就叫做一个长连接
HTTP连接分为两种:
HTTP短连接(非持久连接)是指,客户端和服务端进行一次HTTP请求/响应之后,就关闭连接。所以,下一次的HTTP请求/响应操作就需要重新建立连接。
HTTP长连接(持久连接)是指,客户端和服务端建立一次连接之后,可以在这条连接上进行多次请求/响应操作。持久连接可以设置过期时间,也可以不设置。
HTTP短连接
在首部字段中设置Connection:close,则在一次请求/响应之后,就会关闭连接。
HTTP长连接
在首部字段中设置Connection:keep-aliveKeep-Alive: timeout=60,表明连接建立之后,空闲时间超过60秒之后,就会失效。如果在空闲第58秒时,再次使用此连接,则连接仍然有效,使用完之后,重新计数,空闲60秒之后过期。
设置HTTP长连接,无过期时间
在首部字段中只设置Connection:keep-alive,表明连接永久有效。
实现原理:
了解怎么设置之后,就开始用起来。然而,问题来了。在请求头中设置Connection:keep-alive,为什么连接空闲一段时间之后,还是断开了呢?这是因为connection字段只有服务端设置才有效。
HTTP操作是请求/响应成对出现的,即先有客户端发出请求,后有服务端处理请求。所以,一次HTTP操作的终点操作在服务端上,关闭也是由服务端发起的。

6.HTTP2.0针对同一个域名的多个请求,会建立多少个tcp连接?
记得之前面试一个大厂,面试官问我HTTP1.0,HTTP1.1,HTTP2.0的区别,我内心崩溃啊,并不晓得.
此题目百度一番,见解如下:
http2.0的前世是http1.0和http1.1这两兄弟
http诞生之初主要是应用于web端内容获取,那时候内容还不像现在这样丰富,排版也没那么精美,用户交互的场景几乎没有。对于这种简单的获取网页内容的场景,http表现得还算不错。但随着互联网的发展和web2.0的诞生,更多的内容开始被展示(更多的图片文件),排版变得更精美(更多的css),更复杂的交互也被引入(更多的js)。用户打开一个网站首页所加载的数据总量和请求的个数也在不断增加。
http2.0要解决的一大难题就是多路复用(MultiPlexing),即连接共享。上面协议解析中提到的stream id就是用作连接共享机制的。

7.数据库建表的时候索引有什么用?
数据库索引是为了增加查询速度而对表字段附加的一种标识.
DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
但是,对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。

8.Full Text Search为什么快?
全文检索是对大数据文本进行索引,这个我不是太清楚,有些偏重后台了.

9.iOS下如何实现指定线程数目的线程池?
这个问题不晓得,百度了也不清楚~~~(>_<)~~~

10.介绍下iOS设备获取唯一设备号的历史变迁。
iOS中获取设备唯一标示符的方法一直随版本的更新而变化
但是,推荐大家用KeyChain来保存获取到的UDID,因为APP删了再装回来,也可以从KeyChain中读取回来,哈哈,公司的项目都是把UDID存在KeyChain。(SAMKeychain)

KeyChain.png

11.函数式编程当中的 first-class function是什么意思呢?
这道题目是百度的,我也是知其然不知其所以然....
类型,定义了一个取值的集合,以及可作用的操作的集合。如C语言的int类型有一个上下界,可进行加减乘除等操作。变量可能有 int,float,string。。等类型,函数、对象等也有类型。
进一步,我们把类型分为三类:

  1. First Class。该类型的值可以作为函数的参数和返回值,也可以赋给变量。
  2. Second Class。该类型的值可以作为函数的参数,但不能从函数返回,也不能赋给变量。
  3. Third Class。该类型的值作为函数参数也不行

多数程序语言中的整型、字符类型都是First Class的。在函数式语言(或支持函数式的语言)中,函数也是First Class的,或者说函数是“一等公民”。以函数为参数或返回值的函数称为“高阶函数”。

12.如何使用runtime hook一个class的某个方法,又如何hook某个instance的方法?
首先要考虑 hook是否有公开头文件的类
方法一,hook已有公开头文件的类,写一个Utility函数.
方法二,hook没有公开头文件的类,需要另建一个类作为新函数载体,然后先为被hook的类增加函数,再替换。
方法三,hook没有公开头文件的类,另建一个类作为新函数载体,用新函数替换旧函数,并把旧函数保存到静态变量里.

13.谈下Objective C都有哪些锁机制,你一般用哪个?
iOS开发中常用的锁有如下几种:

  1. @synchronized 同步锁
  2. NSLock 对象锁
  3. NSRecursiveLock 递归锁
  4. NSConditionLock 条件锁
  5. pthread_mutex 互斥锁(C语言)
  6. dispatch_semaphore 信号量实现加锁(GCD)
  7. OSSpinLock 参考YY

14.聊下HTTP post的body体使用form-urlencoded和multipart/form-data的区别。
http与服务器交互最常用的就是GET,POST两个方法.
1.application/x-www-form-urlencoded:
这是标准且默认的编码格式。当action为get时候,客户端把form数据转换成一个字串append到url后面,用?分割。当action为post时候,浏览器把form数据封装到http body中,然后发送到server。
2.multipart/form-data:
multipart表示的意思是单个消息头包含多个消息体的解决方案。multipart媒体类型对发送非文本的各媒体类型是有用的。一般多用于文件上传。

15.让你设计一种机制检测UIViewController的内存泄漏,你会怎么做?
一般都是用Instrument来测试的.

16.通过[UIImage imageNamed:]生成的对象什么时候被释放?
为了方便,一开始读取图像资源的时候都是直接使用了[UIImage imageNamed:@""]方法,这个方法非常方便,一句话就可以从bundle中读取图片。而[UIImage imageNamed:]只适合与UI界面中小的贴图的读取,而一些比较大的资源文件应该尽量避免使用这个接口。使用[UIImage imageWithContentsOfFile]替代.
类方法创建的会自动加入到自动释放池中。

17.applicationWillEnterForeground和applicationDidBecomeActive都会在哪些场景下被调用?举例越多越好。
当程序进入后台状态时,名为applicationWillEnterForeground委托方法会被调用:
-(void)applicationWillEnterForeground:(UIApplication *)application { }
当程序复原时,applicationDidBecomeActive 委托方法会被调用
推送、支付、应用跳转、分享、退到后台等.

18.如何终止正在运行的工作线程
一般来讲网络操作都是可以终止的,就 URLSession 来说,每个 task 都有 cancel 方法,直接 cancel 掉就好了。如果说是耗时的计算类线程,在恰当的地方加个 flag,cancel 时把 flag 置 false,线程就能及时终止。但是,GCD本身是没有提供这样的API的。
终止一个线程中正在执行的任务:
设置一个标识符,假如是BOOL类型的,当它为NO的时候执行任务,当它变为YES的时候终止执行任务。

    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        for (NSInteger i = 0; i < 10000; i++) {
            NSLog(@"%lu",(long)i);
            sleep(2);
            if (flag == YES) {
                NSLog(@"终止任务...");
            }
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"回到主线程刷新UI");
        });
    });

19.穷举iOS下所有的本地持久化方案。
所有的本地持久化数据存储的本质都是写文件,而且只能存到沙盒中。
沙盒机制是苹果的一项安全机制,本质就是系统给每个应用分配了一个文件夹来存储数据,而且每个应用只能访问分配给自己的那个文件夹,其他应用的文件夹是不能访问的。
数据存储的核心都是写文件。主要有四种持久化方式:属性列表,对象序列化,SQLite 数据库, CoreData

20.如果公司强制996,你有什么心里话要对老板说吗?
没什么话,这个要看个人是否能够接受.如果你也认同,那就好好工作.其实真正有效的解决方法并不是努力加班加点,而正好相反:工作更少的时间。更少的工作时间,更高的工作效率才是我们应该掌握的.疲劳的时候工作让你产出值降低。你需要花越来越多的时间来解决问题,然后很快你就会发现你完全在浪费时间。持续长时间的工作会让你难以集中注意,因为你很快就精疲力尽了。

MrPeak大大出的题目我是答了三波才答完的,真心感觉还是有一定难度的,同时自己也借助百度恶补了一番,也让我发现了自己的不足,以后还有多多瞻仰大神之作.😄

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 我的答案 我有过不少面试和被面试的经历,作为面试官出这份面试题从来就不是为了难倒面试者,而是为了多角度全面的了解面...
    北辰青阅读 5,987评论 5 59
  • 看到这个题目是一个群里的朋友发的,感谢那个兄弟,看到MrPeak大大出的题目啊 好开心,试着答,各位大大请轻喷,刚...
    NinaX阅读 3,176评论 2 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 我只想说一句,我又回来了。 历时三个月的出勤,导致我的简书也断更了很久,更多的是自己懒惰的原因吧,疲劳,再加上找不...
    神月新一阅读 473评论 1 1
  • 昨天小车上的两只拉布,我们去从车上接下来的时候,他俩特别调皮,而且还有劲,香江的女生多,又很娇小,牵的时候,他家链...
    冰咋吃阅读 190评论 0 2