面试一

作者: Mr丶炎 | 来源:发表于2016-08-16 12:46 被阅读48次

    一、不用中间变量实现,swap(a,b)

    a = a + b;
    b = a - b;
    a = a - b;

    二、懒加载的好处

    • 防止对象被提前创建
    • 防止对象重复创建
    • 防止对象使用时,还没有创建
    • 可以在懒加载方法中进行初始化操作

    三、runtime的理解
    xcode7是没有runtime提示的,需要自己设置,应该是苹果小心眼了,不让你调用它内部的私有API

    开发中使用场景,runtime什么时候用?
    1、当要使用一个私有方法时,就要使用runtime
    objc_msgSend(id self, SEL op, ...)
    2、纯粹装逼用

    • 叫做运行时,oc的底层就是它实现的,就是运行时候的一些机制,其中最重要的就是消息机制
    • 对于c语言,函数的调用在编译的时候就决定调用哪个函数
    • oc不一样,属于动态调用过程,编译阶段并不能真正决定调用哪个方法,只有运行的时候才会根据方法名称去调用对应的方法
    • 这样看,我们在写c程序时,去调用一个未实现的函数,绝对报错!oc就不一样了,编译阶段可以调用任何方法,即使没有实现,只要声明后!在运行后才报找不到方法

    四、消息是如何推送的
    本地推送

    远程推送

    • 远程推送服务(APNs): 所有的苹果设备,在联网的状态下,都会与服务器建立一个长连接,长连接就是苹果服务器会主动给客户端发消息,长连接的作用,时间校准,系统升级,查看我的iPhone。原理:假如QQ服务器想给QQ客户端推送消息,直接推送是不可能的。只能是QQ服务器推送给APNs服务器,然后APNs推送给QQ客户端

    1、张三发送设备的UDID和应用的Bundle Identifier给APNs
    2、经苹果服务器加密返回一个Device Token,这样APNs就知道推送给哪个设备的哪个应用
    3、张三发送当前用户的Device Token和用户标识给QQ服务器
    4、QQ服务器将用户信息存进数据库
    5、有人要发送消息给张三
    6、去数据库找张三的Device Token
    7、通知苹果服务器
    8、苹果服务器根据Device Token给张三设备

    • 极光推送原理:首先消息推送给极光服务器,极光再Device Token给苹果服务器,然后苹果的APNs服务器根据程序的bundle ID推送给你

    五、数据库文件放哪儿?
    1.沙盒结构

    Application:存放程序源文件,上架前经过数字签名,上架后不可修改
    Documents:常用目录,iCloud备份目录,存放数据,这里不能存缓存文件,否则上架不被通过
    Library
    Caches:存放体积大又不需要备份的数据,SDWebImage缓存路径就是这个
    Preference:设置目录,iCloud会备份设置信息
    tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能

    六、方法调用流程

    • 通过isa去对应的类中查找
    • 注册方法编号
    • 根据方法编号去查找对应方法
    • 找到只是最终函数地址,根据地址去方法区调用对应函数

    七、内存五大区
    栈 ,堆,全局区, 文字常量区,程序代码区

    • 栈:由编译器自动分配释放,不需要手动管理内存,自动管理
    • 堆:需要手动管理内存,自己释放
    • 全局区:存放全局变量和静态变量
    • 常量区:存放常量字符串
    • 代码区:存放二进制代码

    八、5L水杯,3L水杯怎么取出4L水
    先取3L水倒进5L水杯中,再取3L水倒进5L的水杯中,这样3L的水杯里面还有1L的水。5L水倒掉,将1L放入5L中,再取3L的水,这样就有4L的水了

    九、UIView和核心动画的区别

    核心动画什么时候用
    不需要与用户进行交互时
    根据路径做动画时
    做转场动画时

    • 核心动画只作用在layer上
    • 核心动画看到的都是假象,并没有去修改UIView的真实位置

    十、ipv6相关

    • 项目里面涉及和网络相关的是否支持ipv6
    • 项目里面涉及和网络相关的SDK是否支持ipv6
    • 项目的服务器是否支持ipv6

    十一、优化

    一、首页启动速度
    启动过程中做的事情越少越好(尽可能将多个接口合并)
    不在UI线程上作耗时的操作(数据的处理在子线程进行,处理完通知主线程刷新)
    在合适的时机开始后台任务(例如在用户指引节目就可以开始准备加载的数据)
    尽量减小包的大小
    优化方法:
    量化启动时间
    启动速度模块化
    辅助工具(友盟,听云,Flurry)
    二、页面浏览速度
    json的处理(iOS 自带的NSJSONSerialization,Jsonkit,SBJson)
    数据的分页(后端数据多的话,就要分页返回,例如网易新闻,或者 微博记录)
    数据压缩(大数据也可以压缩返回,减少流量,加快反应速度)
    内容缓存(例如网易新闻的最新新闻列表都是要缓存到本地,从本地加载,可以缓存到内存,或者数据库,根据情况而定)
    延时加载tab(比如app有5个tab,可以先加载第一个要显示的tab,其他的在显示时候加载,按需加载)
    算法的优化(核心算法的优化,例如有些app 有个 联系人姓名用汉语拼音的首字母排序)
    三、操作流畅度优化:
    Tableview 优化(tableview cell的加载优化)
    ViewController加载优化(不同view之间的跳转,可以提前准备好数据)
    四、数据库的优化:
    数据库设计上面的重构
    查询语句的优化
    分库分表(数据太多的时候,可以分不同的表或者库)
    五、服务器端和客户端的交互优化:
    客户端尽量减少请求
    服务端尽量做多的逻辑处理
    服务器端和客户端采取推拉结合的方式(可以利用一些同步机制)
    通信协议的优化。(减少报文的大小)
    电量使用优化(尽量不要使用后台运行)
    六、非技术性能优化
    产品设计的逻辑性(产品的设计一定要符合逻辑,或者逻辑尽量简单,否则会让程序员抓狂,有时候用了好大力气,才可以完成一个小小的逻辑设计问题)
    界面交互的规范(每个模块的界面的交互尽量统一,符合操作习惯)
    代码规范(这个可以隐形带来app 性能的提高,比如 用if else 还是switch ,或者是用!还是 ==)
    code review(坚持code Review 持续重构代码。减少代码的逻辑复杂度)
    日常交流(经常分享一些代码,或者逻辑处理中的坑)

    2.App Bundle 里面有什么

    Info.plist:此文件包含了应用程序的配置信息.系统依赖此文件以获取应用程序的相关信息
    可执行文件:此文件包含应用程序的入口和通过静态连接到应用程序target的代码
    资源文件:图片,声音文件一类的
    其他:可以嵌入定制的数据资源

    12、runtime实现的机制是什么?怎么用,一般用于干嘛。

    运行时机制,runtime库里面包含了跟类、成员变量、方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量、动态改变类的方法实现,为类动态添加新的方法等,需要导入<objc/message.h><objc/message.h>
    ①.runtime,运行时机制,它是一套C语言库。
    ②.实际上我们编写的所有OC代码,最终都是转换成为了runtime库的东西,比如类转换成了runtime库里面的结构体等数据类型,方法转换成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)
    ③、因此,可以说runtime是OC的底层实现,是OC的幕后执行者。
    ④、有了runtime库,能做什么呢?可以获取类里面的所有成员变量、为类动态的添加成员变量、动态的改变类的方法实现、为类动态添加新的方法等等。

    13、iOS 的签名机制大概是怎样的?

    假设,我们有一个APP需要发布,为了防止中途篡改APP内容,保证APP的完整性,以及APP是由指定的私钥发的。首先,先将APP内容通过摘要算法,得到摘要,再用私钥对摘要进行加密得到密文,将源文本、密文、和私钥对应的公钥一并发布即可。那么如何验证呢?
    验证方首先查看公钥是否是私钥方的,然后用公钥对密文进行解密得到摘要,将APP用同样的摘要算法得到摘要,两个摘要进行比对,如果相等那么一切正常。这个过程只要有一步出问题就视为无效。

    14、strong / weak / unsafe_unretained 的区别?

    weak只能修饰OC对象,使用weak不会使计数器加1,对象销毁时修饰的对象会指向nil
    strong等价与retain,能使计数器加1,且不能用来修饰数据类型
    unsafe_unretained等价与assign,可以用来修饰数据类型和OC对象,但是不会使计数器加1,且对象销毁时也不会将对象指向nil,容易造成野指针错误

    15、当系统出现内存警告时会发生什么?

    会将不在当前窗口上的view暂时移除
    如果放任内存警告,最终会导致软件强制被系统关闭

    相关文章

      网友评论

          本文标题:面试一

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