1.关于AFNetworking
a. 主要作用
- 异步数据请求
- 检测网络状态
- 缓存图片
b.get和post的区别
- 安全性问题 :
get 请求的参数全部暴露在接口中,一般叫做明文请求或者傻瓜式请求。post请求的参数一般是以字典的方式进行拼接,相对于get比较安全
- 对文件的要求:
get不与许向服务器上传文件(图片,pdf,音视频等) - 如果从服务器获取数据或者查询数据使用get请求,如果上传数据到服务器或者修改服务器上数据用post
2.关于SDWebImage
- a. 作用:加载网络图片的第三方库,实现了异步请求数据,并且实现了图片的缓存
- b. 实现原理:在内存和沙盒目录下个缓存一份文件,内存中的文件到一定程度会自动清除,沙盒目录下的文件需要由用户手动清除,程序运行首先检查内存-检测沙盒目录-网络请求
原理
别人博客的,看到很好拿过来用
2.进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:。
3.先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
4.SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
5.如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
6.根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
7.如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
8.如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
9.共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
10.图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
11.connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
12.connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
13.图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
14.在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
15.imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
16.通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
17.将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
18.SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
19.SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
20.SDWebImagePrefetcher 可以预先下载图片,方便后续使用。```
####3. kvc和kvo的区别
> * 一. KVO是注册观察者模式,是一种监听模式。Key-Value Observing (简写为KVO)
a.通过注册观察者addObserve的方法,可以获取监听的对象变化的值,从而实现要变化的方法。
b.例如有两个滑动视图,希望其中一个视图滑动时候,另一个视图也跟着变化,同时变化相同的偏移量,那么可以注册一个观察者,观察视图1的偏移量变化,在观察者方法
``` -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context```
中,根据change的值获得视图1的偏移量,并让视图二做出相同的偏移。
* 二. KVC是访问对象属性的方法,K即key,V即Value,C是coding系统的编码方式。
a. 通过setValue:forKey的方式,给对象的某一个属性赋值,在未公开属性的情况下就可以使用这种方法.
b. 比如有一个Person类,有一个Person *person = [[Person alloc] init]对象,想给个name属性,并给name一个值“张三”,就可以写成[person setValue:"张三" forKey:"name"],如果说person又一个公开的name属性,那么上一句话就等于person.name=@"张三"。
####4. 设计模式:MVC 工程 代理 KVO
##### MVC:
> 模型-视图-控制器(MVC)设计模式,MVC根据角色划分类,涉及到三个角色:
a. Model:模型保存应用程序的数据。
b.View:视图是模型的可视化表示以及用户交互的控件。
c.Controller:控制器是一个协调所有工作的中介者。它访问模型中的数据并在视图中展示它们,同时它们还监听事件和操作数据。
#####单例:
> 单例设计模式可以确保对于一个类只有一个实例(对象)存在,这个对象有一个全局的访问点。通常采用懒加载的方式在第一次用到对象的时候才去创建它。
#####代理:遵循协议的对象
> 步骤:
第一步:制定协议:(协议名:类名+Delegate)
第二步:制定代理
第三步:代理遵循协议.
第四步:代理实现协议里面的必须实现的方法和其他可选方法.
第五步:委托方通知代理开始执行方法.
#####KVO
KVO Key-Value Observing.它是一种机制,当指定的对象的属性被修改后,KVO自动通知相应的观察者
步骤:
> a.注册观察者
b.更改主题对象属性的值,即触发发送更改的通知
c.在制定的回调函数中,处理收到的更改通知
d.注销观察者
#####代理和通知的区别
* 代理:1个对象只能告诉另1个对象发生了什么事
* 通知:1个对象可以告诉N个对象发生了什么事
#####协议:
* 能力 - 遵守协议就意味着具备了协议所描述的能力
* 约定 - 遵守协议就必须要实现协议中的所有方法
* 角色 - 遵循一个协议就代表可以扮演一种角色
####5.类方法和实例方法的区别
类方法:即static方法,在Swift我们也可以用class代替static。创建方法: static + 一般方法 。
类方法是属于类对象的,所以无需创建类的实例对象,我们可以直接使用它们,直接用类名点出来
实例方法: 即普通的方法,需要用实例对象来访问。
区别;
> * 类方法是属于整个类,而不属于某个对象。
* 类方法只能访问类成员变量,不能访问实例变量,而实例方法可以访问类成员变量和实例变量。
* 类方法的调用可以通过类名.类方法和对象.类方法,而实例方法只能通过对象.实例方法访问。
* 类方法只能访问类方法,而实例方法可以访问类方法和实例方法。
* 类方法不能被覆盖,实例方法可以被覆盖。
#### 6. iOS7 iOS8 iOS9的区别
> a:
![Snip20160906_20.png](https://img.haomeiwen.com/i2862090/725227b1fec8b061.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#### 7. 继承和类别的区别
在Objective-C中,给一个类扩展一个其它方法,有两种实现方式:类别和继承。
1.继承Inherit
这个是面向对象语言都有的一个特性,子类会继承父类的方法和属性。对于以下情况,无法使用类别,必须使用继承。
> * 新扩展的方法与原方法同名,但是还需要使用父类的实现。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。
* 扩展类的属性,这个类别无法做到。
2.类别category
这是Objective-C语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展。以下两种方式最后使用类别。
> * 针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。
* 类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。
> 其它相关比较好的说明[http://my.oschina.net/jack088/blog/605813]
在Swift中,格局一个类扩展一个其它方法,由两种实现方式:继承和扩展。
继承:同OC一样,继承父类的所有属性方法,无法多继承
扩展:除了扩展方法之外,新增了一个可以扩展计算型属性
#### 8. frame和bounds的区别
frame和bounds是UIView中的两个属性(property)
区别:
> * frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
> * bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)。我们一半不会去设置bounds的值,只会去拿它的大小。并且改变bounds的坐标不会影响frame的坐标和大小,只会影响当前视图的子视图的原点位置
#### 9. 对比iOS中的四种数据存储
归档、NSUserDefaults、SQLite、CoreData
这四种存储方案侧重不同,支持的形式和方式也各不相同,在不同的使用场景下表现也是各有优劣。但万变不离其宗,无论什么方案都可以用下图来解释。
![Snip20160907_10.png](https://img.haomeiwen.com/i2862090/780c26e516af2480.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
关于这四种方法的分析
> * NSUserDefaults,用于存储配置信息
* SQLite,用于存储查询需求较多的数据
* CoreData,用于规划应用中的对象
* 使用基本对象类型定制的个性化缓存方案
更多[http://www.infoq.com/cn/articles/data-storage-in-ios/]
#### 10. 简述NSUserDefaults的使用场景和使用注意事项:
> 对于NSUerdefaults来说 一般可以用来保存用户的偏好设置 比如登陆账号 密码这些。 除此之外 我们还可以用它来保存图片, 字符串 , 数字 和对象。它被保存到项目中的Plists文件里面里。保存图片 一般用它里面的两个方法 图片保存可以用PNG或者JPG对应的方法 先转换成NSData 再用NSUerdefaults保存 保存的时候为了让它马上存下来要用synchronize 。它还可以用来在程序间进行反向传值。
#### 11. 响应者链
简单来说响应者链就是一层一层的 :如解析这个图
![Snip20160907_11.png](https://img.haomeiwen.com/i2862090/cb9360b4371cc590.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
如这个图 我们点击,如果点的事ViewB区域的,ViewA是没办法点击的用户交互没有开,所以就传递给下一层ViewB 如果这个时候ViewB的用户交互也没有开,那么这个点击事件就会
网友评论