1.多线程、特别是NSOperation和GCD的内部原理:
->1)NSThread
优点:NSThread比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销
2)Cocoa NSOperation
优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。
Cocoa operation相关的类是NSOperation, NSOperationQueue.
NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类: NSInvocationOperation和NSBlockOperation.
创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。
3) GCD(全优点)
Grand Central dispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。
————————————————————
2.运行时机制的原理和运用场景:
->机制:Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理;这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码;这个运行时系统即Objc Runtime。Objc Runtime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。
->应用场景:runtime发送消息;runtime交换方法(继承系统的类,重写方法);runtime动态添加方法;runtime给分类添加属性;runtime字典转模型;runtime快速归档
————————————————
3.SDWebImage的原理,实现机制:
->SDWebImage内部实现过程
入口setImageWithURL:placeholderImage:options:会先把placeholderImage显示,然后SDWebImageManager根据URL开始处理图片。
进入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给SDImageCache从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.
先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。
SDWebImageManagerDelegate回调webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示图片。
如果内存缓存中没有,生成NSInvocationOperation添加到队列开始从硬盘查找图片是否已经缓存。
根据URLKey在硬盘缓存目录下尝试读取图片文件。这一步是在NSOperation进行的操作,所以回主线程进行结果回调notifyDelegate:。
如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调imageCache:didNotFindImageForKey:userInfo:。
共享或重新生成一个下载器SDWebImageDownloader开始下载图片。
图片下载由NSURLConnection来做,实现相关delegate来判断图片下载中、下载完成和下载失败。
connection:didReceiveData:中利用ImageIO做了按图片下载进度加载效果。
connectionDidFinishLoading:数据下载完成后交给SDWebImageDecoder做图片解码处理。
图片解码处理在一个NSOperationQueue完成,不会拖慢主线程UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
在主线程notifyDelegateOnMainThreadWithInfo:宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo:回调给SDWebImageDownloader。
imageDownloader:didFinishWithImage:回调给SDWebImageManager告知图片下载完成。
通知所有的downloadDelegates下载完成,回调给需要的地方展示图片。
将图片保存到SDImageCache中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独NSInvocationOperation完成,避免拖慢主线程。
SDImageCache在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
SDWI也提供了UIButton+WebCache和MKAnnotationView+WebCache,方便使用。
SDWebImagePrefetcher可以预先下载图片,方便后续使用。
———————————————————————————
4.block和代理的,通知的区别。block的用法需要注意些什么:
->区别:1.NotificationCenter通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;
2.delegate代理委托:
1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;
2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
3.block(闭包)
block和delegate一样,一般都是“一对一”之间通信交互,相比代理block有以下特点
1:写法更简练,不需要写protocol、函数等等
2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
3,block需要注意防止循环引用
—————————————————————————
5.单利的写法,在单利中创建数组应该注意些什么:
->+ (instancetype)shareId
{
static ViewController *VC = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
VC = [[ViewController alloc] init];
});
return VC;
}
6.->http状态吗:302是请求重定向。500以上是服务器错误。400以上是请求链接错误或者找不到服务器。200以上是正确。100以上是请求接受成功
——————————————————————
7.什么是TCP连接的三次握手:
->第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
————————————————————————
8.内存分区:
->代码区;常量区;全局区(静态区);堆区(存放对象);栈区(存放局部变量)
————————————————————————
9.KVC(key value coding)和KVO(key value observing):
->1.KVC方式可以更便捷的设置获取对象的值(可以批处理,键路径)。
2.KVO可以对对象进行监听属性的变化。
区别:KVC(键值编码),即Key-Value Coding,一个非正式的Protocol,使用字符串(键)访问一个对象实例变量的机制。而不是通过调用Setter、Getter方法等显式的存取方式去访问。
KVO(键值监听),即Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,对象就会接受到通知,前提是执行了setter方法、或者使用了KVC赋值。
--------------------------------------------------------------------------------
10.http协议 get post的区别:
---->POST是安全的,GET是不安全的。
GET请求地址和参数全放在请求头中,POST请求地址和请求参数分离,地址放在请求头中,参数拼接放入请求体。
GET和POST都是和服务器提交参数/通讯的一种方式。
GET参数不能太长<1024B POST没有限制<4G
GET不能上传文件, POST可以上传文件。
网友评论