iOS常见面试题

323 阅读5分钟

面试题

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 数定义:前面的数都比它小,后面的数都比它大)