一、不用中间变量实现,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暂时移除
如果放任内存警告,最终会导致软件强制被系统关闭