面试题总结

作者: 只写Bug程序猿 | 来源:发表于2017-10-12 16:41 被阅读166次

    搜狗面试题

    1.iOS应用的文件目录都是什么?缓存文件存在哪个文件里?它的上一层是什么?
    答:沙盒,应用程序沙盒目录下有三个文件夹Document,Library(下边有caches和Preferences),tmp.

    • Documents: 保存应用运行时生成的需要持久化的数据Iturn是会自动备份该目录.苹果建议将在应用程序中浏览到文件数据保存在该目录下.
    • Library/Caches:一般存储的是缓存文件,例如图片视频等,此目录下的文件不会再应用程序退出时删除,在手机备份的时候,iTunes不会备份该目录。
    • Library/Preferences:保存应用程序的所有偏好设置iOS的Settings(设置),我们不应该直接在这里创建文件,而是需要通过NSUserDefault这个类来访问应用程序的偏好设置。iTunes会自动备份该文件目录下的内容。
    • tmp:临时文件目录,在程序重新运行的时候,和开机的时候,会清空tmp文件夹。
    • SystemData:(ios 11)

    2.SDWebImage图片处理原理?
    答:

    3.SDWebImage在iOS9 3dtouch下出现的问题?
    答:

    4.NSArray和NSMutableArray在Copy和MutableCopy下的内存是怎样的?
    答:使用copy或者mutableCopy 可以创建一个对象的副本
    copy 需要实现NSCopping 协议 mutableCopy需要实现NSMutableCopping协议

    深复制:内容拷贝,源对象和副本只想的是不同的两个对象,拷贝指针和内存地址.源对象引用计数器不变,副本计数器设置为1.
    浅复制:指针拷贝,源对象和副本指向同一个对象,对象引用计数+1,相当于做了一个retain操作
    只有不可变对象创建不可变副本才是浅复制其他都是深复制

    5.用户下载一个图片,图片很大,需要分成很多份进行下载,使用GCD应该如何实现?使用什么队列?
    答:

    6.现有两个人和一张桌子,两个人依次在桌子上放硬币,硬币不能叠放、立着,若一方找不到放的位置则失败。若你在玩这个游戏,设计一个算法必赢。
    答:本题目表面上看很难着手,因为我们既不知道桌子大小形状,也不知道硬币的大小形状。实际上,退一步想,如果硬币足够大,一个硬币就盖住桌子,那么先手必赢。现在进一步,硬币小了,一个硬币不能盖住桌子了,只要桌子是对称的,不管桌子大小,也不管桌子是什么形状的,先手只要先占住了对称中心,以后每次放硬币的地方都是对手所放的地方的对称点,那么对手有地方放时先手一定有地方放硬币,先手就能保证胜券在握。因此我们用对称性思想很快就找到解决问题的思路。

    7.现有n个物品和一个体积为V的包,每件物品的体积是ci,价格是wi,现在请你往包中放,每件物品只能放一次,怎么放能让包的价格最大。
    答:

    百度iOS面试题:

    1.Delegate 、Notification和KVO比较各自的优缺点
    答:

    • Delegate:
      1.语法严格,所有将要听到的事件必须在delegate协议中有清晰的定义
      2.一个控制器中可以定义多个不同的协议,每个协议有不同的delegate
      3.能够接受调用的协议方法的返回值
      4.一对一的通信
    • Notification
      1.代码量少 实现简单
      2.1对多的通信
      3.可以携带自定义消息
      4.需要在不用的时候注销通知
      5.调试难以追踪
      6.通知发注后,不能从观察者得到任何反馈信息
      7.代码可读性不强
      8.notifacationName必须相同,否则无法接受消息
    • KVO
      1.用key paths 来观察属性, 因此可以观察嵌套对象
      2.能够提供一种简单的方法实现两个对象间的同步
      3.能够对非我们创建的对象, 即内部对象的状态改变做出响应, 而且不需要改变内部对象的实现
      4.观察的属性必须使用 string 来定义, 因此编译器不会出现警告
      5.对属性重构将导致我们的观察代码不再可用

    2.在一个UI的正中间实现一个正方形的红色视图有几种方式?
    答:layer, drawrect,添加控件等等

    3.手触碰到屏幕的时候,响应机制是怎样的?第一响应者是谁?追问 UIView和UIResponse的关系是什么?
    答:
    响应者对象是一个能接受并处理事件的对象,UIResponser是所有响应者对象的基类,该基类定义了一系列编程接口,不但为事件处理进行服务而且还提供了通用的响应行为处理,UIApplication、UIView(UIWindow)、UIViewController都直接或间接的继承自UIResponser,所有的这些类的实例都是响应者对象
    响应者链表示一系列的响应者对象,事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者(nextresponder)

    • 事件响应者链传递过程
      1.当用户与视图交互时,会将消息传递给视图控制器,如果不存在控制器,传递给父视图
      2,如果不处理该消息,则继续将消息向上传递,如果最上层的视图也不处理,将事件交给window对象,最后交由UIApplication实例,如果不处理,丢弃事件
      http://www.jianshu.com/p/01368ea1c7f0
      4。UIViewController的生命周期是什么?追问 UIViewController 只alloc而没用到的时候,UIViewController 的view是否加载了?如果没有加载那什么时候加载?
      答:ViewController的生命周期中各方法执行流程如下:
      init->loadView->viewDidLoad->viewWillAppear->viewDidAppear->viewWillDisAppear->viewDidDisappear->viewWillunload->viewDidUnload->dealloc
      UIViewController 只alloc而没用到的时候,UIViewController 的view还没有加载了因为:当你alloc并init一个Controller时这个Controller还没有创建view,Controller的view是使用lazyinit方式创建,就是说你调用的view属性的getter方法:[self view].在getter方法里会判断view是否创建,如果没有创建那么会调用loadview来创建view,loadview完成后会继续调用viewdidload,
      两者的一个区别就是,一个没有view,一个已经创建好view.
      (init里不要出现创建view的代码,良好的设计在init里应该只有相关数据的初始化,而且这些数据都是比较关键的数据,init里不要调用self.view,否则会导致viewcontroller创建view:因为view是lazyinit的)
      5.直接用UILabel和自己用DrawRect画UILabel,哪个性能好?为什么?哪个占用的内存少?为什么?
      答:
      暂不知道如何作答,(希望各位指导)
      31019821-C1C9-4B06-857D-585D40A485CE.png
      这是在一个文档上看到的
      6.AFNetworking是否支持ipv6?
      答:自己百度吧,资料很多

    7.项目采用64位,为什么要用64位?怎么修改成64位?i386是什么?他们有什么关系?
    答:
    http://www.cocoachina.com/ios/20150106/10848.html
    i386即Intel 80386。其实i386通常被用来作为对Intel(英特尔)32位微处理器的统称

    8.iOS的应用程序有几种状态?追问,退到后台代码是否可以执行?双击home键,代码是否可以执行?
    答:
    1.Not running:应用还没有启动,或者应用正在运行但是途中被系统停止

    1. Inactive:应用正在前台运行但是不接收事件,(也许正在执行其他代码).一般当应用要从一个状态切换到另一个不同状态时,中途过度会短暂停留在此状态.唯一在此状态停留事件较长的情况是:当用户锁屏时,或者系统提示用户去响应某些(如来电,有未读短信)事件的时候
      3.active:当前应用正在前台运行,并且接收事件,这是应用正在前台运行时所处的正常状态
      4.background:应用处在后台,并且还在执行代码,大多数将要进入suspend状态的应用,会先短暂进入此状态,然而对于请求需要额外的执行事件的引用会在此状态停留更长一点的时间,另外,如果一个程序要求启动时直接进入后台运行,这样的应用会直接从notrunning状态直接进入background状态,中途不会经过inactive状态.
      5.suspend状态,应用处在后台,并且已经停止运行代码,系统自动的将应用程序移入次状态,且在这之前不会做任何通知,当处在次状态时,应用依然驻留在内存中单不执行任何程序代码,当系统发生内存报警时,系统将应用挂起,进入suspend状态
      双击home键,程序回由active状态变为inactive状态,
      - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. //当应用程序即将从活动状态转移到非活动状态时发送(应该还没有变为inactive状态所以这个方法里边的代码会执行的)。这种情况可能发生在某些类型的临时中断(比如传入的电话或SMS消息),或者当用户退出应用程序时,它开始向后台状态过渡。 / /使用此方法暂停正在进行的任务,禁用计时器,并降低OpenGL ES帧速率。游戏应该用这个方法暂停游戏。 }

    9.一般使用的图标内存为多大?比如200×300的图片,内存应该占用多少比较合理?
    答:不知道

    10.说说你对内存泄漏的看法,追问,block为什么容易引起内存泄漏?
    答:在使用block时引起强引用循环时会导致严重的内存泄漏,而大家要注意的是,循环强引用的条件是block中引用了强引用的self,而另一必要条件是self也同时引用了block。所以只要自己定义的block不被其他对象持有,并且block在添加到各线程中之后已经执行完毕,则其中就算因为self强引用了创建他的对象,也不会导致严格意义上的内存泄漏,因为在执行完毕之后,block被真正的释放.则其对self的强引用也已经被释放,只要此时self不要去强引用这个block就不会造成循环引用.

    11.[object copy]是浅拷贝还是深拷贝?为什么是浅拷贝?copy是实现了哪个协议?
    答:略

    12.Images.xcassets和直接用图片有什么不一样?
    答:
    1.将图片放入Images.xcassets里边

    • 无论是通过imagenamed:加载图片还是直接在storyboard的UIimageview中设置图片,而且无论后缀是jpg还是png都不需要写后缀名
    • 不能通过imagesWithContentsOfFile来加载.(因为这个方法相当于是去mainbundle里找图片,而图片是存在Images.xcassets中的)
    • 图片更换名字后不用再去代码中修改,比如Images.xcassets中存在一张a.png的图片,然后在Images.xcassets中替换为b.png,代码依然为[uiimage imagenamed:@"a.png"];
    • 不用再为多像素的图片命名. Images.xcassets会自动排列不同像素的图片

    杭州-口碑-p6-7 面试题

    1.Nsstring栈空间占了多少?
    答:

    2.SD最大支持多少个下载数?
    答:6

    3.yykit如何异步渲染?
    答:

    4.runtime动态创建一个类,需要注意什么?
    答:

    5.runloop和线程有和关系?
    答:

    6.你平时做过什么有技术难点的东西,然后解决难点
    答:

    7.你是如何学习iOS,看什么网站,列举几个国外的学习网站?
    答:

    8.技术架构如何搭建?
    答:

    9.还有一个很长字符串,你用什么算法搜索到abc的位置?
    答:

    10.字符串如何预处理?
    答:

    11.https和ssl在握手方向有什么区别?
    答:

    12.还有,你平时很忙,怎么学习和积累技术
    答:

    13.怎么防止别人动态在你程序生成代码
    答:

    14.怎么防止反编译
    答:

    阿里面试

    Object-c中copy和mutableCopy 区别

    ViewController之间怎么传值
    代理通知kvo,block,她们之间的区别和好处.
    内存管理原则,MRC 和 ARC

    应用的启动过程

    868FA546-8405-4C54-8EA4-C1640DCF9363.png

    启动原理:
    1.首先找到程序入口,执行main函数 main-UIApplicationMain
    2.UIApplicationMain底层做事情

    • 创建application对象
    • 创建application的代理对象,并赋值
    • 开启主运行循环,做用接收事件,让程序一直运行
    • 加载info.plist文件,判断有没有指定main.storyboard,如果指定就去加载,如果没有则需自己手工创建window并显示

    推送原理(本地推送和远程推送)
    首先应用系统会弹框询问用户是否允许推送,如果允许,则应用向苹果服务器请求deveicetoken,并将苹果服务器返回的token发送给我们的服务器,自己的服务器然后将token和要推送的内容发给苹果服务器,苹果服务器将推送消息发给自己的应用,完成推送
    定位

    一轮面聊,问题大概是这些:

    当画了一个图,就是subview有一部分view飘出来了,问点击飘出来的部分能不能响应点击事件?
    一般情况下是不能响应事件的

    1.hidden = yes;
    2. userInteractionEnabled = no;
    3.alpha< 0.01
    

    这三种情况下也是不能响应事件的
    命中测试hitTest方法,首先会判断以上三个条件,然后判断点击点事否在自己身上,然后遍历自视图,返回一个最适合处理事件的view,
    如果想让他能处理事件,必须重写view的父视图的hittest方法,判断如果点击的point在view身上不管他又没有飘出来,都吧这个view返回回来,让命中测试能够命中就ok了

    xcode中怎么给系统方法打断点

    xcode签名原理

    怎么将符号转换成代码

    字典模型的转换。引出MJExtension框架,问了MJExtension的原理,以前使用过程中有没有bug(我猜他在使用过程中发现了MJExtension 框架中的bug所以才这么问)

    循环引用、检测 泄露、TableView滑动卡顿解决方案等等

    阿里二面:

    1. 怎么判断某个cell是否显示在屏幕上
    2. 进程和线程的区别
    3. TCP与UDP区别
    4. TCP流量控制
    5. 数组和链表的区别
    6. UIView生命周期
    7. 如果页面 A 跳转到 页面 B,A 的viewDidDisappear方法和 B 的viewDidAppear方法哪个先调用?

    A push B

    2017-10-26 16:38:44.748403+0800 test2[3452:1288708] ViewController == -[ViewController viewWillDisappear:]
    2017-10-26 16:38:44.748551+0800 test2[3452:1288708] BViewController == -[BViewController viewWillAppear:]
    2017-10-26 16:38:45.304422+0800 test2[3452:1288708] ViewController == -[ViewController viewDidDisappear:]
    2017-10-26 16:38:45.304572+0800 test2[3452:1288708] BViewController == -[BViewController viewDidAppear:]
    从打印结果先后顺序看:【A-->B-->A-->B】
    1、调用 A 的 viewWillDisappear 方法,
    2、调用 B 的 viewWillAppear 方法
    3、调用 A 的 viewDidDisappear 方法
    4、调用 B 的 viewDidDAppear 方法

    A present C

    2017-10-26 16:45:17.957380+0800 test2[3456:1291552] ViewController == -[ViewController viewWillDisappear:]
    2017-10-26 16:45:17.957632+0800 test2[3456:1291552] CViewController == -[CViewController viewWillAppear:]
    2017-10-26 16:45:18.471787+0800 test2[3456:1291552] CViewController == -[CViewController viewDidAppear:]
    2017-10-26 16:45:18.472829+0800 test2[3456:1291552] ViewController == -[ViewController viewDidDisappear:]
    从打印结果先后顺序看:【A-->C-->C-->A】
    1、调用 A 的 viewWillDisappear 方法,
    2、调用 C 的 viewWillAppear 方法
    3、调用 C 的 viewDidAppear 方法
    4、调用 A 的 viewDidDisappear 方法

    8. block循环引用问题
    9. ARC的本质
    10. RunLoop的基本概念,它是怎么休眠的
    11. Autoreleasepool什么时候释放,在什么场景下使用
    12. 如何找到字符串中第一个不重复的字符
    13. 哈希表如何处理冲突
    14. https原理,这个问的相当细,包括单向双向认证

    阿里三面面试题:

    1.dSYM你是如何分析的?
    2.多线程有哪几种?你更倾向于哪一种?
    3.单例弊端?
    4.如何把异步线程转换成同步任务进行单元测试?
    5.介绍下App启动的完成过程?
    6.比如App启动过慢,你可能想到的因素有哪些?
    7.0x8badf00d表示是什么?
    8.怎么防止反编译?
    9.说说你遇到到的技术难点?
    10.说说你了解的第三方原理或底层知识?

    阿里-p6-一面

    1.介绍下内存的几大区域?
    2.你是如何组件化解耦的?
    3.runtime如何通过selector找到对应的IMP地址
    4.runloop内部实现逻辑?
    5.你理解的多线程?
    6.GCD执行原理?
    7.怎么防止别人动态在你程序生成代码
    8.YYAsyncLayer如何异步绘制?
    9.优化你是从哪几方面着手?

    汽车之家面试题

    对大量数据列表有什么优化方案?

    内存优化,开启tableviewcell的重用机制在tableview的heightforrow函数中不要在调用cellforrow方法,应该把之前计算到的行高缓存起来,避免cellforrow被调用很多次

    对加载的数据进行存储,将加载过的数据存储到数据库中,及时清空内存中的数据

    进行分页处理,异步加载更多数据
    如何检查app的内存和CPU的使用情况?检查有问题的时候如何处理?

    使用analyze检查代码有无内存泄露的可能产生

    使用leaks检查程序是否有内存泄露产生

    Xcode的instrument可以检测到app在运行时候的内存消耗,当内存占用量过大的时候即使释放掉不用的对象
    app上有一数据列表,客户端和服务器都没有缓存服务器有数据更新的时候在wifi下能刷新到数据在4G下刷新不到数据,请分析可能产生的原因?

    用户禁止了该app使用蜂窝移动数据

    代码中可能为了省流量,对网络类型做了判断,只在wifi状态下发送请求

    当前维护app的崩溃率是多少?怎么最终并解决的?如何解决线上的闪退

    我们努力把崩溃率控制在5/1000 一下 ,使用plcrashreport第三方框架统计用户崩溃日志
    什么是事件响应链,当用户和手机屏幕触摸的时候都发生了什么?事件是如何传递的。

    发生触摸事件后系统将触摸事件加入UIApplication管理的事件队列中,

    UIApplication会从事件队列中取出最前面的事件在将事件发送出去,通常会发给keywindow

    主窗口会在视图层次结构中找到最合适的视图来处理触摸事件

    找到合适的视图控件后,就会调用视图控件的touches方法来作事件的具体处理:touchesBegin...
    touchesMoved...touchesEnded等

    会顺着响应者链条往子控件传递
    UIView不能接收触摸事件情况有哪些:

    1.不接受用户交互:userInteractionEnabled = NO;

    2.隐藏:hidden = YES;

    3.透明:alpha = 0.0~0.01
    如何找到最合适的控件来处理事件呢?有什么原则?

    自己是否能接受触摸事件

    触摸点是否在自己身上

    从后往前遍历子控件,重复上面的两个步骤

    如果没有符合条件的子控件,那么自己最适合处理
    runloop是什么?,使用runloop的目的是什么?使用runloop要注意什么?何时使用?

    我朋友未回答
    NSRunLoop是IOS消息机制的处理模式

    NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠。

    NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)异步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。

    runloopmode是一个集合,包括监听:事件源,定时器,以及需通知的runloop observers
    runloop与线程的关系?

    只有在为你的程序创建次线程的时候,才需要运行run loop。对于程序的主线程而言,run loop是关键部分。Cocoa提供了运行主线程run loop的代码同时也会自动运行run loop。IOS程序UIApplication中的run方法在程序正常启动的时候就会启动run loop。如果你使用xcode提供的模板创建的程序,那你永远不需要自己去启动run loop

    在多线程中,你需要判断是否需要run loop。如果需要run loop,那么你要负责配置run loop并启动。你不需要在任何情况下都去启动run loop。比如,你使用线程去处理一个预先定义好的耗时极长的任务时,你就可以毋毋需启动run loop。Run loop只在你要和线程有交互时才需要
    进程和线程的区别?

    一个应用程序有且只有一个进程,一个进程有1个和多个线程
    线程生命周期

    当我们创建一个线程实例对象的时候,这个线程是创建状态

    当调用了start的方法的时候,线程被启动,此时进入就绪状态,等待CUP来执行

    获取CPU的资源正在执行,这个时候进入运行状态

    当线程执行完毕,或者被其他线程杀死的时候这个时候线程进入死亡状态,死亡状态的线程不可能在进入等待执行的就绪状态

    由于某些原因,线程需要暂停自己,让出CPU的资源,这个时候线程进入阻塞状态

    淘宝-P6

    1.查找字符串算法
    2数组匹配算法
    3.代码文件编译生成过程,编译和链接有什么区别,链接做了什么事情
    4.用C语言实现一个通知流程
    5.A B 线程执行到一半去执行C线程,用OC和C各自怎么实现。
    6.用过GCD什么方法
    7对什么技术比较感兴趣
    8.tableview怎么优化,优化后还是感觉卡怎么办
    9.怎么定位到野指针的地方。如果还没定位到,这个对象被提前释放了,怎么知道该对象在什么地方释放的
    10.ARC的实现原理,什么情况下用MRC比ARC好
    11.懂视频技术吗
    12.16进制的FF + 2后 等于什么 有哪几种情况?

    饿了么面试题:

    你了解哪些iOS底层知识

    • automic一定是线程安全的吗
    • iOS中的消息传递是怎么一步一步实现的
    • category和extension有什么区别
    • iOS中的私有属性如何设置
    • 串行队列和同步锁两者在保护线程安全上的性能对比
    • 并行队列是同时执行的吗
    • iOS中有哪些锁,你了解多少
    • iOS中UIKit框架的架构
    • UIView和CALayer之间的关系
    • UIView、CoreAnimation和CoreGraphics的关系
    • 应该知道SegmentFault,这个在iOS中是什么错误,那StackOverFlow呢
    • GCD、NSThread、NSOperation性能上有何区别

    网易一面iOS:

    1.你一般学习iOS是如何学习的?

    2.app内存你是如何分析的?

    3.用过 TableView 吗,平时怎么解决 TableView 滑动卡顿问题的?

    4.网络模型了解么?有哪几种?说说你的看法?
    1、OSI的来源
    OSI(Open System Interconnect),即开放式系统互联。 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互连模型。
    ISO为了更好的使网络应用更为普及,推出了OSI参考模型。其含义就是推荐所有公司使用这个规范来控制网络。这样所有公司都有相同的规范,就能互联了。
    2、OSI七层模型的划分
    OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。如下图。
    每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接口提供给更高一层。各层所提供的服务与这些服务是怎么实现的无关。

    640.jpg
    3、各层功能定义
    这里我们只对OSI各层进行功能上的大概阐述,不详细深究,因为每一层实际都是一个复杂的层。后面我也会根据个人方向展开部分层的深入学习。这里我们就大概了解一下。我们从最顶层——应用层 开始介绍。整个过程以公司A和公司B的一次商业报价单发送为例子进行讲解。
    <1> 应用层 OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。
    实际公司A的老板就是我们所述的用户,而他要发送的商业报价单,就是应用层提供的一种网络服务,当然,老板也可以选择其他服务,比如说,发一份商业合同,发一份询价单,等等。
    <2> 表示层 表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
    由于公司A和公司B是不同国家的公司,他们之间的商定统一用英语作为交流的语言,所以此时表示层(公司的文秘),就是将应用层的传递信息转翻译成英语。同时为了防止别的公司看到,公司A的人也会对这份报价单做一些加密的处理。这就是表示的作用,将应用层的数据转换翻译等。
    <3> 会话层 会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
    会话层的同事拿到表示层的同事转换后资料,(会话层的同事类似公司的外联部),会话层的同事那里可能会掌握本公司与其他好多公司的联系方式,这里公司就是实际传递过程中的实体。他们要管理本公司与外界好多公司的联系会话。当接收到表示层的数据后,会话层将会建立并记录本次会话,他首先要找到公司B的地址信息,然后将整份资料放进信封,并写上地址和联系方式。准备将资料寄出。等到确定公司B接收到此份报价单后,此次会话就算结束了,外联部的同事就会终止此次会话。
    <4> 传输层 传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP UDP就是在这一层。端口号既是这里的“端”。
    传输层就相当于公司中的负责快递邮件收发的人,公司自己的投递员,他们负责将上一层的要寄出的资料投递到快递公司或邮局。
    <5> 网络层
    本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。
    网络层就相当于快递公司庞大的快递网络,全国不同的集散中心,比如说,从深圳发往北京的顺丰快递(陆运为例啊,空运好像直接就飞到北京了),首先要到顺丰的深圳集散中心,从深圳集散中心再送到武汉集散中心,从武汉集散中心再寄到北京顺义集散中心。这个每个集散中心,就相当于网络中的一个IP节点。<6> 数据链路层 将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。
    数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。
    MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并非必需的。
    这个没找到合适的例子
    <7> 物理层
    实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。 快递寄送过程中的交通工具,就相当于我们的物理层,例如汽车,火车,飞机,船。
    4、通信特点:对等通信 对等通信,为了使数据分组从源传送到目的地,源端OSI模型的每一层都必须与目的端的对等层进行通信,这种通信方式称为对等层通信。在每一层通信过程中,使用本层自己协议进行通信。
    640.jpg

    5.block本质是什么?

    6.KVC机制是如何通过key找到value

    KVC键值查找
    搜索单值成员
    • setValue:forKey:搜索方式

    1、首先搜索setKey:方法。(key指成员变量名,首字母大写)
    2、上面的setter方法没找到,如果类方法accessInstanceVariablesDirectly返回YES。那么按 _key,_isKey,key,iskey的顺序搜索成员名。(NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)
    3、如果没有找到成员变量,调用setValue:forUnderfinedKey:

    *valueForKey:的搜索方式

    1、首先按getKey,key,isKey的顺序查找getter方法,找到直接调用。如果是BOOL、int等内建值类型,会做NSNumber的转换。
    2、上面的getter没找到,查找countOfKey、objectInKeyAtindex、KeyAtindexes格式的方法。如果countOfKey和另外两个方法中的一个找到,那么就会返回一个可以响应NSArray所有方法的代理集合的NSArray消息方法。
    3、还没找到,查找countOfKey、enumeratorOfKey、memberOfKey格式的方法。如果这三个方法都找到,那么就返回一个可以响应NSSet所有方法的代理集合。
    4、还是没找到,如果类方法accessInstanceVariablesDirectly返回YES。那么按 _key,_isKey,key,iskey的顺序搜索成员名。
    5、再没找到,调用valueForUndefinedKey。

    7.说说你最熟悉的第三方,知晓其原理么?

    iOS技术面试很可能问到需要准备的问题整理
    1.OC内存管理机制(MRC与ARC本质与区别)
    2.MVC与MVVM设计模式的本质与区别
    3.Delegate与Protocol,Observer(Notification、KVC/KVO)三者的本质与区别
    4.AFN与ASI的使用以及二者区别以及内部核心方法的封装实现细节考察
    5.SDWebImage原理及缓存机制实现细节考察
    6.对常用控件的使用(自定义UITableView或UICollectionView控件)及Controller进行定制以及复杂的UI搭建(复杂页面cell的高度计算与UITextView相关的图文混排处理等涉及性能优化和提升软件界面流畅度等技术细节)
    7.移动开发中的数据存储管理:本地化NSUserDefault、轻量级数据库SQLite、序列化Plist、归档NSKeyArchiver、单例AppDelegate、代码块Block等数据存储机制灵活运用(使用场景与异同点以及需要注意的使用细节)
    8.HTTP、HTTPS,IP(TCP /UDP)协议的使用场景与异同点
    9.多线程技术NSThread/GCD/NSOperation的使用场景与异同点
    10.MapKit/CoreLocation地图组件,AVFoundation/CoreMedia多媒体组件等常用系统控件的节熟练使用细节与注意事项(自定义控件与主流第三方SDK的熟练使用)
    11.第三方登录/单点登录(qq,微信,微博等)、分享(主流第三方分享友盟分享,ShareSDK 等社会化SDK的集成与自定义细节处理)、支付(微信,支付宝,网银等)等功能
    12.Git/SVN等代码管理工具的熟练使用与日常使用细节考察
    13.Cocapods等第三方开源库的管理工具的日常熟练使用情况与细节考察(特别是团队开发与组件化开发过程中:1. 如何把pod搞成静态库?3. 如何搭建私有podspec?4.如何分模块编译打包,加快编译速度等等)

    1. Swift语言熟练程度考察与 Cocos2d和Cocos2d-X的熟练程度考察
      15.对大前端技术栈提法的思考与自身技术范围掌握情况(含前端+后端,跨平台技术的掌握,对weex和RN的掌握与技术选型,前端组件Vue等优秀组件的使用情况等等)
      16.代码风格与技术规范考察,自学能力考察(通过科学上网获取自主续性学习途径(Stack Overflow,Github,知名技术Blog等)
      (仅为个人学习使用,答案有错希望大家指正,参考http://www.jianshu.com/p/fe6c1606a9ba)

    相关文章

      网友评论

        本文标题:面试题总结

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