iOS面试题

1. struct和class的区别

swift中,class是引用类型,struct是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。所以他们两者之间的区别就是两个类型的区别。

class有这几个功能struct没有的:

class可以继承,这样子类可以使用父类的特性和方法

类型转换可以在runtime的时候检查和解释一个实例的类型

可以用deinit来释放资源

一个类可以被多次引用

struct也有这样几个优势:

结构较小,适用于复制操作,相比于一个class的实例被多次引用更加安全。

无须担心内存memory leak或者多线程冲突问题

顺便提一下,array在swift中是用struct实现的。Apple重写过一次array,然后复制就是深度拷贝了。猜测复制是类似参照那样,通过栈上指向堆上位置的指针来实现的。而对于它的复制操作,也是在相对空间较为宽裕的堆上来完成的,所以性能上还是不错的。

下面引用猫神OneV的博客:

var arr = [0,0,0]var newArr = arrarr[0] =1//Check arr and newArrarr//[1, 0, 0]newArr// before beta3:[1, 0, 0], after beta3:[0, 0, 0]

所以可以猜测其实在背后 Array和 Dictionary的行为并不是像其他 struct 那样简单的在栈上分配,而是类似参照那样,通过栈上指向堆上位置的指针来实现的。而对于它的复制操作,也是在相对空间较为宽裕的堆上来完成的。当然,现在还无法(或者说很难)拿到最后的汇编码,所以这只是一个猜测而已。

补充:

C语言中,struct与的class的区别:

struct只是作为一种复杂数据类型定义,不能用于面向对象编程。

C++中,struct和class的区别:

对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。

2. 介绍一下观察者模式

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

在IOS中典型的推模型实现方式为NSNotificationCenter和KVO。

NSNotificationCenter

NSNotificationCenter

观察者Observer,通过NSNotificationCenter的addObserver:selector:name:object接口来注册对某一类型通知感兴趣。在注册时候一定要注意,NSNotificationCenter不会对观察者进行引用计数+1的操作,我们在程序中释放观察者的时候,一定要去报从center中将其注销了。

通知中心NSNotificationCenter,通知的枢纽。

被观察的对象,通过postNotificationName:object:userInfo:发送某一类型通知,广播改变。

通知对象NSNotification,当有通知来的时候,Center会调用观察者注册的接口来广播通知,同时传递存储着更改内容的NSNotification对象。

KVO

KVO的全称是Key-Value Observer,即键值观察。是一种没有中心枢纽的观察者模式的实现方式。一个主题对象管理所有依赖于它的观察者对象,并且在自身状态发生改变的时候主动通知观察者对象。

注册观察者

[object addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:]。

更改主题对象属性的值,即触发发送更改的通知。

在制定的回调函数中,处理收到的更改通知。

注销观察者 [object removeObserver:self forKeyPath:property]。

3.在一个HTTPS连接的网站里,输入账号密码点击登录后,到服务器返回这个请求前,中间经历了什么

这个非常得深非常得广,我来大概说一下。

HTTPS加密流程

客户端会打包一个请求,包括url,端口啊,你的账号密码等等。账号密码登陆应该用的是Post方式,所以相关的用户信息会被加载到body里面。这个请求应该包含三个方面:网络地址,协议,资源路径。注意,这里是HTTPS,就是HTTP + SSL / TLS,在HTTP上又加了一层处理加密信息的模块(相当于是个)。

一般会先请求DNS服务器。DNS服务器负责将你的网络地址解析成IP地址,这个IP地址对应网上一台机器。这其中可能发生Hosts Hijack和ISP failure的问题。

协议是获取资源的方式HTTP,FTP,UDP,不同协议有不同的格式,有些是process-to-process的,有些是host-to-host的。

客户端会和服务器的端口之间建立一个socket连接,socket一般都是以file descriptor的方式解析请求。

服务器端接收到请求。服务器端会有一套数字证书(相当于是个钥匙),这个证书会先返回给客户端。客户端会解析证书,相当于用钥匙(证书)把锁(内容)锁上(生成私匙),接着再传送加密信息。

服务器端接收到加密信息(私匙)之后,会进行解密,并把要返回的数据进行对称加密返回到客户端。假如路径不对,会出现404的错误。

一般访问服务器之前可能会访问一下proxy。这玩意是个代理,有时候当防火墙用,有时候当cache使。如果后台是reverse-proxy结构,那么实际上有多个web服务器藏在proxy之后按需处理请求,而你访问的永远是proxy,这样可以解决过载问题。

有时候访问完web服务器后还要访问一下file服务器,主要是请求数据库里的一些信息。

服务器将相应打包,直接或通过proxy(大多数时候)返回给客户端。客户端会用刚刚生成的私匙进行解密,将内容显示在浏览器上。

HTTPS加密过程详解请去https原理:证书传递、验证和数据加密、解密过程解析

4.在一个app中间有一个button,在你手触摸屏幕点击后,到这个button收到点击事件,中间发生了什么

响应链大概有以下几个步骤

设备将touch到的UITouch和UIEvent对象打包, 放到当前活动的Application的事件队列中

单例的UIApplication会从事件队列中取出触摸事件并传递给单例UIWindow

UIWindow使用hitTest:withEvent:方法查找touch操作的所在的视图view

RunLoop这边我大概讲一下

主线程的RunLoop被唤醒

通知Observer,处理Timer和Source 0

Springboard接受touch event之后转给App进程

RunLoop处理Source 1,Source1 就会触发回调,并调用_UIApplicationHandleEventQueue() 进行应用内部的分发。

RunLoop处理完毕进入睡眠,此前会释放旧的autorelease pool并新建一个autorelease pool

深挖请去深入理解RunLoop

UIResponder是UIView的父类,UIView是UIControl的父类。

声明一下,第3题依然有很大缺陷,不过因为深挖的地方太多,本文不可能完全兼顾,只能抛砖引玉。另外文章的目的是以面试题为引进行学习,所以写得有点多,可能与面试技巧和时间有冲突。

4道过滤菜鸟的iOS面试题

字数660 阅读5644 评论34 喜欢67

网上已经有很多针对各种知识点的面试题,面试时有些人未必真正理解也能通过背题看上去很懂。我自己总结了4道面试题,好快速的判断这个人是否是一个合格的工程师,欢迎大家点评。

1.struct和class的区别

在面试之前你觉得所有的计算机专业的学生都应该能答的上来,事实是我面的人里有超过三分一没有答上来。

有时我还会顺便问下swfit里的array是什么类型,在大量复制时会不会有性能问题。

2.介绍一下观察者模式

也许有些人已经觉得设计模式有些过时,没有整本读过。就算如此iOS里常用的几个设计模式我觉得总要了解吧。

这里如果说NSNotificationCenter怎么使用的就直接pass。

这个回答应该包括三个部分:首先这个设计模式为了解决什么问题,其次通过什么方案来解决,最后才是当前体系下的具体实现方案。

3.在一个https连接的网站里,输入账号密码点击登录后,到服务器返回这个请求前,中间经历了什么

这题是在其他看到的,本来题目是登录gmail的时候,但是国内也许有些人不知道Google很早就全站https了,所以这里特别指出是https的连接。

这里面可以谈的东西就很多了,TCP/IP下有非常多的协议。不需要什么都能说的清楚,但是对于整个网络连接模型的理解可以看出基本功。

4.在一个app中间有一个button,在你手触摸屏幕点击后,到这个button收到点击事件,中间发生了什么

runloop和响应链需要说的清楚。

有时还会顺便问问UIResponder、UIControl、UIView的关系。

这4个问题只是为了一上来可以快速筛选掉不合适的程序员,毕竟有的人只需要几分钟就知道他不合适了,好节省时间。

中午吃饭我和一个资深的同事说这些题目,我说,一个15k+的程序员我觉得一定能答的上这四题。他说你也太乐观了,按现在这行情他觉得恐怕要20k的程序员才能答的上来。

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

推荐阅读更多精彩内容

  • 1. 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。 1.1 深拷贝同浅拷贝...
    iYeso阅读 1,886评论 0 13
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性...
    克鲁德李阅读 444评论 0 0
  • OC的理解与特性OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(...
    LIANMING_LI阅读 511评论 0 0
  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 2,538评论 0 20