美文网首页iOS面试题iOS进阶
美团点评面试题整理

美团点评面试题整理

作者: 泰克2008 | 来源:发表于2017-08-08 19:07 被阅读128次

    美团点评:

    1、git add 和 git commit 的区别

    git add   # 从工作区被提交到暂存区,但此时文件并没有真正进入到版本库当中,文件目前只处于一个中间状态。
    git commit  # 这个命令将处于中间状态的文件(暂存区的文件)提交到版本库中,这时才算真正完成了一次提交过程。
    

    2、JS交互的原理是什么

    # native直接调用js的方法:
    - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
    
    # JS直接调用native的方法
    其实,UIWebView并没有提供JS调用native的方法,但是我们却可以通过间接的方法来实现这样的操作。总结看来,间接实现的方式有三种: 
    1. 在代理方法拦截Url,识别判断 
    2. Block传值,实现JS调用OC 
    3. 模型实现,JS直接用oc方法名来调用oc方法 
    4. 使用第三方工具类:WebViewJavascriptBridge
    
    链接:http://www.jianshu.com/p/bdd340b46076
    

    3、为什么说HTTP请求是短连接,怎样才能实现HTTP长连接

    # 短连接
    在HTTP/1.0中,默认使用的是短连接。
    也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
    如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
    # 长连接
    但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:
    Connection:keep-alive
    客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间,譬如:
    Keep-Alive: timeout=20,表示这个TCP通道可以保持20秒。
    另外还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。
    对于客户端来说,如果服务器没有告诉客户端超时时间也没关系,
    服务端可能主动发起四次握手断开TCP连接,
    客户端能够知道该TCP连接已经无效;
    另外TCP还有心跳包来检测当前连接是否还活着,方法很多,避免浪费资源。
    在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,
    如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
    Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
    # HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
    容易混淆的概念——TCP的keep alive和HTTP的Keep-alive
    TCP的keep alive是检查当前TCP连接是否活着;HTTP的Keep-alive是要让一个TCP连接活久点。它们是不同层次的概念。
    TCP keep alive的表现:当一个连接“一段时间”没有数据通讯时,一方会发出一个心跳包(Keep Alive包),如果对方有回包则表明当前连接有效,继续监控。
    这个“一段时间”可以设置。
    # 长连接和短连接的优点和缺点
    长连接:长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。
    Client 与 server 之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候
    短连接:短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
    但如果客户请求频繁,将在 TCP 的建立和关闭操作上浪费时间和带宽。
    
    

    4、Object-C Category和Extension的区别

    # Category
    用于给class及其subclass添加新的方法
    有自己单独的 .h 和 .m 文件
    用于添加新方法,而不能添加新属性(property)
    #  Extension
    Extension常被称为是匿名的Category
    用于给类添加新方法,但只作用于原始类,不作用于subclass
    只能对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework class,是不可以的
    Extension可以给原始类添加新方法,以及新属性
    

    5、swift中Class和结构体的区别

    * 类是引用类型,结构体是值类型,不能使用===/!== 判断地址
    * 类可以继承,结构体不能继承
    * 结构体没有deinit 方法
    * 创建结构体要比创建对象速度快
    * 创建相同属性的结构体比类更加节省内存
    * 在数据量比较大的排序中,结构体排序的速度比较慢,因为结构体是值类型,排序的时候,需要大量的赋值运算。而对象只需要交换地址即可。
    

    4、多线程处理都具体用在了什么地方

    * 多图片上传使用到了 NSOperationQueue + NSBlockOperation
    * dispatch_async(dispatch_get_main_queue(), ^{});用在了下载视频、音乐下载、直播IM等功能上更新UI
    * NSThread用在了JS交互上,用来判断是否是主线程 if ([[NSThread currentThread] isMainThread])
    

    5、DB-ORM框架设计

    * 所谓ORM,即对象-关系映射(Object/Relation Mapping),方便我们以操作对象的方式去操作关系型数据库。
    * 将一个SQL语句以面向对象方式进行设计,构建者模式动态构建表。
    * 共包括五个模块,分别是数据库连接对象、构建SQL语句、构建创建表、操作表、附加功能(排序、修改重命名、条件筛选、增加字段、删除字段等)
    * 整个框架设计基于构建者模式,迭代器模式遍历表字段
    

    6、响应式编程框架设计

    * 响应式编程可以加深你代码抽象的程度,让你可以更专注于定义与事件相互依赖的业务逻辑,而不是把大量精力放在实现细节上,同时,使用响应式编程还能让你的代码变得更加简洁。
    * 特别对于现在流行的webapps和mobile apps,它们的 UI 事件与数据频繁地产生交互,在开发这些应用时使用响应式编程的优点将更加明显。
    

    7、MVP框架设计

    * MVP分为Model、View、Presenter三层:
    * Model作为模型层,在MVP中更偏向于功能的模型,负责对数据的存取操作,例如对数据库的读写,网络的数据的请求等;
    * View作为视图层,代表着布局和控件;
    * Presenter作为主持层,也就是主持着View与Model之间的交互。
    * MVP框架中,断绝了View与Model之间的直接交互,成功的减少了controller中的臃肿代码,使得controller能够保持整洁清晰。
    

    相关文章

      网友评论

        本文标题:美团点评面试题整理

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