美文网首页
iOS面试题

iOS面试题

作者: 寂寞天琊 | 来源:发表于2016-09-05 20:29 被阅读37次

    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的用户交互也没有开,那么这个点击事件就会
    

    相关文章

      网友评论

          本文标题:iOS面试题

          本文链接:https://www.haomeiwen.com/subject/llorettx.html