浅复制与深复制(深浅拷贝)
@浅复制 - 只复制指向对象的指针,而不复制引用对象本身。
复制的两份指向的是同一个内存资源,当一方改变时另一方也会做出同样的改变。
@深复制 - 复制引用对象本身,两个对象是独立存在的。
`
类别与继承
@类别 - 在不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
1). 将类的实现分散到多个不同文件或多个不同框架中。
2). 创建对私有方法的前向引用。
3). 向对象添加非正式协议。
@继承 - 子类继承父类,可以增加、修改或者删除方法,并且可以增加属性。
`
MVC与MVVM
@MVC - 即模型-视图-控制器开发模式,模型层存储数据,视图层用来展示界面,
控制器层通过处理数据加载、用户交互、业务逻辑,来控制模型层和视图层。
@MVVM - 即Model-View-ViewModel的开发模式,它是在MVC的基础上,
将控制器层的数据加载部分进行分离,转移到ViewModel中,减轻控制器层的臃肿程度。
`
Block
Block 类似于C语言的函数指针,可以作为参数进行传递,用于回调。但Block的实现可用定义在方法中,函数不可以。
`
多线程
@NSThread -
@NSOperation -
@GCD -
`
内存管理
`
assign/copy/retain/strong/weak/nonatomic/atomic/
@assign - 普通赋值,一般用于C语言的基本数据类型、代理,以此来防止循环引用。
@strong - 强引用,在ARC中使用strong告诉编译器帮助我们自动插入retain。
@weak - 普通赋值,相当于手动管理内存的assign。
@nonatomic - 非原子性访问,不加同步,多线程并发访问会提高性能。
`
KVC和KVO
@KVC - 即指NSKeyValueCoding,一个非正式的Protocol,提供一种机制直接通过字符串的名字来间接访问对象的属性。
而不是通过调用Setter、Getter方法访问。KVO就是基于KVC实现的关键技术之一。
@KVO - 即Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。
简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
`
ViewController的生命周期
`
iOS 创建一个最简单的单例
+ (instancetype)sharedInstance {
static <#className#> * instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
`
TCP和UDP
TCP全称为传输控制协议,提供面向连接、可靠的、点到点的通信。
UDP全称为用户数据报协议,提供非连接、不可靠、点到多点的通信。
`
Socket和Http连接
Http连接:即所谓的短连接,客户端向服务端发送一次请求,服务端响应后连接会立即断掉。
Socket连接:即所谓的长连接,理论上客户端与服务端一旦建立起连接将不会主动断掉。
1、什么是Socket?
Socket又称之为“套接字”,是系统提供的用于网络通信的方法。它的实质并不是一种协议,没有规定计算机应当怎么样传递消息,
只是给程序员提供了一个发送消息的接口,程序员使用这个接口提供的方法,发送与接收消息。
Socket描述了一个IP、端口对。它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,
再由服务器端来处理发送的这些消息。所以Socket一定包含了通信的双发,即客户端(Client)与服务端(server)。
2、Socket的通信过程?
每一个应用或者说服务,都有一个端口。比如DNS的53端口,http的80端口。我们能由DNS请求到查询信息,
是因为DNS服务器时时刻刻都在监听53端口,当收到我们的查询请求以后,就能够返回我们想要的IP信息。
所以,从程序设计上来讲,应该包含以下步骤:
1)服务端利用Socket监听端口;
2)客户端发起连接;
3)服务端返回信息,建立连接,开始通信;
4)客户端,服务端断开连接。
即时通讯最大的特点就是实时性,基本感觉不到延时或是掉线,所以必须对socket的连接进行监视与检测,在断线时进行重新连接,
如果用户退出登录,要将socket手动关闭,否则对服务器会造成一定的负荷。
`
TCP三次握手
`
Runtime
RunTime简称运行时。是一套比较底层的纯C语言的API, Objective-C是运行在Runtime上的。
对于C语言,函数的调用在编译的时候会决定调用哪个函数。编译完成之后直接顺序执行,无任何二义性。
OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数
(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。
只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
`
Runloop
Runloop是事件接收和分发机制的一个实现。它提供了一种异步执行代码的机制,不能并行执行任务。
在主队列中,Main RunLoop直接配合任务的执行,负责处理UI事件、定时器以及其他内核相关事件。
RunLoop可以保证程序执行的线程不会被系统终止。所以当需要和该线程进行交互的时候才会使用Runloop,
一般情况下我们是没有必要去启用线程的RunLoop的,除非你在一个单独的线程中需要长久的检测某个事件。
每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后去run它。
`
Git
`
CoreData
`
static
`
@常见算法 -
递归法、
穷举法、
贪心算法、
分治法、
动态规划法、
分支界限法、
回溯法
@常见数据结构 -
数组、
堆、
栈、
队列、
链表、
树(满二叉树、完全二叉树)、
图、
Hash表
@常见设计模式 -
代理模式(为其他对象提供一个代理以控制对这个对象的访问)、
观察者模式(定义对象间的一种一对多的依赖关系,
以便当一个对象的状态发生改变时,
所有依赖于它的对象都得到通知并自动刷新)、
单例模式(保证一个类有且仅有一个实例,并且自行实例化向整个系统提供)、
工厂模式(定义一个用于创建对象的接口,让子类决定将哪一个类实例化)、
外观模式、
适配器模式