面试题
1.指针和引用区别
指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已
引用不可以为空,当被创建的时候,必须初始化,而指针可以是空值,可以在任何时候被初始化。
可以有const指针,但是没有const引用;
指针可以有多级,但是引用只能是一级
指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。
“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小
指针和引用的自增(++)运算意义不一样;引用自增被引用对象的值,指针自增内存地址
在传递参数的区别
2.线程安全
多线程操作共享数据不会出现想不到的结果就是线程安全的,否则,是线程不安全的。
线程不安全是由于多线程访问造成的,
锁:OSSpinLock(弃用),dispatch_semaphore,pthread_mutex,NSLock,NSCondition,NSRecursiveLock,NSConditionLock,@synchronized
3. .http和https区别
HTTPS ****协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。
HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
4.将两个有序数组合并(swift实现),倒序遍历
func merge(_ num1: inout [Int],_ m: Int,_ num2: [Int],_ n:Int) -> [Int] {
var p1 = m - 1
var p2 = n - 1
var tail = m + n - 1
var cur: Int
while p1 >= 0 || p2 >= 0 {
if p1 == -1 {
cur = num2[p2]
p2 -= 1
} else if p2 == -1 {
cur = num1[p1]
p1 -= 1
} else if num1[p1] > num2[p2] {
cur = num1[p1]
p1 -= 1
} else {
cur = num2[p2]
p2 -= 1
}
num1[tail] = cur
tail -= 1
}
return num1
}
5.进程&线程区别
进程:一个在内存中运行的应用程序
线程:进程中的一个执行任务,负责当前进程中程序的执行
每个进程之间是独立的,每个进程具有独立的内存空间;同一个进程内的线程共享进程资源
一个进程可以拥有多个线程,但最少要有一个主线程
6.APNS的具体实现细节,长连接,device id
远程推送的基本过程:
1.手机app将手机的UUID和app的bundleID发送给苹果的apns服务器,进行注册;apns将加密后的deviceToken返回给app。
2.app获得deviceToken后,上传到公司服务器。
3.当需要推送通知时,公司服务器会将推送内容和deviceToken一起发给apns服务器。
4.apns再将推送内容推送到相应的手机app上。
7.UIView frames和bounds的区别
1.frame不管对于位置还是大小,改变的都是自己本身
2、frame的位置是以父视图的坐标系为参照,从而确定当前视图在父视图中的位置
3、frame的大小改变时,当前视图的左上角位置不会发生改变,只是大小发生改变
4、bounds改变位置时,改变的是子视图的位置,自身没有影响;其实就是改变了本身的坐标系原点,默认本身坐标系的原点是左上角
5、bounds的大小改变时,当前视图的中心点不会发生改变,当前视图的大小发生改变,看起来效果就想缩放一样
8.如何判断链表有环?(快慢指针)
9.TCP三次握手四次挥手?
TCP三次握手:A和B通过短信进行联系
第一次握手:A->B:走,去食堂吃饭
第二次握手:B->A:好,那我去老地方等你
第三次握手:A->B:好的,我马上过来
通过第一次握手说明第一次对话成功
通过第一次和第二次对话证明了B能够听懂A说的话,并且能做出正确的应答
通过第二次和第三次的对话证明了A能够听懂B说的话,并且能做出正确的应答
为什么要进行三次握手而不是两次呢?也就是说为什么A最后还要发送一次确认呢?
主要是避免“已失效的连接请求报文段”的产生
TCP是面向连接的运输层协议,在应用程序使用TCP协议之前,必须先建立TCP连接。在传输数据完毕后,必须释放已经建立的TCP连接。并且TCP提供的是可靠交付的服务。且TCP提供全双工通信。所以要进行三次握手来确保在不可靠信道上可靠的传输信息。三次通信是理论上在不可靠信道上进行可靠通信的最小值
为什么建立连接协议是三次握手,而关闭连接却是四次挥手呢?
这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了, 所以你可能未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
10.UIView渲染到屏幕的过程,越详细越好
11.UIView和CALayer的关系
12.Xcode中的workspace、xcodeproj、target、schema的关系
13.load和initialize的区别和调用时机
14.找出一个数组中的所有K数(K 数定义:前面的数都比它小,后面的数都比它大)