iOS面试重点

2018-12-17  本文已影响91人  Fisland_枫

[TOC]

一 属性

快速问答

  1. delegate 属性为什么使用 weak ?
    • 是为了避免循环引用
  2. xib/storybard连接的对象为什么使用weak?
    • 因为控件的父控件view.superview已经strong reference了,所以对于controller只需要weak就可以
  3. 字符串 为什么使用copy?
    • 因为复制问题,对于不可变我们使用copy,,我们希望的是内容的copy,不希望被外部改变同时还改变原有的内容
  4. Block 为什么使用 copy?
    • block一开始是放在栈上面,只有copy之后才会放到堆上面。

更多内容 OC @Property属性

二 Runtime

什么是Runtime

  1. 简称运行时,就是系统在运行时候的一些机制,主要是消息机制
  2. 对于C语言,在编译期间已经确定好函数调用的顺序,没有二义性
  3. 但是OC函数调用为消息发送,属于动态调用过程。在编译时期不能决定真正调用的到底是哪个函数。
  4. 只有在运行时时候,根据函数的名称来找到对应的函数来调用

常用情况

补充文章 iOS开发进阶-Runtime简介及应用详解

三 RunLoop

RunLoop是什么

我们手机应用是事件驱动的整体架构,对于我们来说,理想的状态是:程序在激活状态下,没事就闲着,有事把它唤醒,接着就去分配执行事件,处理完了再去闲着,这样才不会占用资源。
RunLoop是线程的基础架构部分,每个线程都有自己的RunLoop对象,用来接收循环中的时间和安排的线程工作,并在没有工作时,让线程进入睡眠状态。

RunLoop作用

  1. 使得程序一直运行并能接受用户的事件输入
  2. 决定程序应该在何时处理事件(Event)
  3. 通用解耦(Message Queue),主调方和被调方
  4. 节省CPU资源

RunLoop的mode类型

四 NSThread、NSOperation、GCD

iOS有三种多线程方式,NSThread、NSOperation、GCD,越往后抽象程度越高,使用起来越简单,也是苹果越推荐

  1. NSThread, 最轻量级,相对简单,但是需要自己手动管理所有的线程活动,如生命周期,线程同步,睡眠等。
  2. NSOperation,自带线程周期管理。操作上可以更注重自己的逻辑,但是面向对象的抽象类,只能实现它或者它定义好的两个子类,NSInvocationOperation和NSBlockOperation
  3. GCD,最高效,避开并发陷阱。一般安全有简单可以使用NSOperation.而处理大量并发数据,

详情参考:
多线程简介
创建线程
线程安全
线程通信
线程状态
GCD1
GCD2

五 Block、Delegate、Notification

Block的使用(1)
Block的使用(2)

六 UDP、TCP、Socket、HTTP、POST、GET

UDP、TCP区别

区别 TCP UDP
有无连接 面向连接的协议 五连接协议
可不可靠 可靠(丢包会自动重传) 不可靠
有无序 有序(可以对其乱序的重排序) 无序
有无界 无界(通过字节流传输) 有界(每个包都是独立的)
有无流量控制 流量控制(拥塞控制) 没有
速度 传播慢(建立连接,保证可靠和有序比较耗时) 传播快
大小 重量级,信息多,头部大(20个字节) 轻量级,头部小(8个字节)
基于的协议 HTTP,Telent,FIP,SMTP DNS,DHCP,SNMP,TFTP

TCP三次握手

Socket和HTTP的区别

  1. HTTP是基于TCP连接的,是应用协议,主要解决如何包装数据;Socket是对TCP/IP协议的封装,本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
  2. HTTP:短连接,客服端发起,服务端返回后断开连接,节省资源。服务端不能主动发起,(除非使用HTTP长连接技术);
  3. Socket:长连接,客服端可服务端使用Socket通信。保持连接通道,双方都可以自动发送数据,一般用于游戏,默认连接超时时间30秒,默认大小8k

GET、POST区别

七 简述内存分区情况

栈和堆区别

  1. 栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。
  2. 栈的空间是有限的,而对是很大的自由存储区
  3. C中的malloc函数分配的内存空间是在堆上的,C++中对应的new操作符。
  4. 程序在编译期对变量

区别下面指针的不同

上一篇 下一篇

猜你喜欢

热点阅读