1.如何在OC中调用swift的文件?
步骤:直接托swift文件 --> 建立桥接头文件 --> target --> building
setting--> 输入product --> Packaging --> Project ModuleName
--> SwiftModule --> 在桥接头文件里加入头文件#import "SwiftModule-
swift.h"
作用: 此头文件中就包含了所有.swift的文件
2.get和post的区别?
解答:
a.安全性问题:get请求的参数全部暴露在接口中,一般叫做明文请求或者是傻瓜式请
求,post请求的参数一般以字典的方式进行拼接,相对于get比较安全
b.对文件大小的一个要求:get请求不允许向服务器上传文件(图片,PDF,音视
频),一般以post进行上传文件
c.如果从服务器获取数据或者查询数据使用get请求,如果上传数据到服务器或者修改
服务器上数据使用post
3.错误处理:unacceptable content-type: text/html?
解决方案:
manager.responseSerializer.acceptableContentTypes = NSSet(object: "text/html") as! Set < String >
4.了解:APPDelegate和viewController的生命周期
AppDelegate的生命周期:贯穿整个程序的从开始到结束的全过程
详解:
application(程序启动入口) --> applicationWillResignActive(将进入活跃
状态)--> applicationDidBecomeActive(已经进入活跃状态) -->
applicationDidEnterBackground(进入后台) -->
applicationWillEnterForeground(将进入前台) -->
applicationWillTerminate (程序将被中断的)ViewController的生命周期:是指视图View从加载到注销加载的全过程
详解:
init(创建视图) --> loadView(开始加载)--> viewDidLoad(加载成功) -->
viewWillAppear(视图将要出现) --> viweDidAppear(视图显示出来) -->
viewWillDisappear(视图将要消失) --> viewDidDisappear(视图已经消失) -->
viewDidUnload(注销加载) --> dealloc(被释放)
参考文档
5.SDWebImage在内存中的实现原理?
作用:SDWebImage是用来加载网络图片的第三方库,实现了异步请求数据,并且实现了图片的缓存
解答: 在内存和沙盒目录下各缓存一份文件,内存中的文件到一定程度会自动清除,沙盒目录下的文件需要由用户手动清除,首先检测内存 --> 检测沙盒目录 --> 网络请求(都没有时才会进行网络请求)
5.1.AFNetworking的实现原理
NSURLConnection,主要对NSURLConnection进行了进一步的封装,包含以下核心的类:
AFURLConnectionOperation
AFHTTPRequestOperationManager
AFHTTPRequestOperation
NSURLsession
NSURLSession对象进行了进一步的封装,包含以下核心的类:AFURLSessionManager
AFHTTPSessionManagerReachability,提供了与网络状态相关的操作接口,包含以下核心的类:
AFNetworkReachabilityManager
Security,提供了与安全性相关的操作接口,包含以下核心的类:
AFSecurityPolicy
Serialization,提供了与解析数据相关的操作接口,包含以下核心的类:
AFURLRequestSerialization
AFURLResponseSerialization参考文献
6.版本迭代
作为一款产品,总会有一些共性,从一开始的诞生到 —— 开始的不完善到不断的自我完善,然后再不断的变更需求、改动功能、修改bug和优化性能等中更换版本使之适应各种环境和外部需求得以生存壮大。
7.KVC和KVO的区别
回答:
官方回答
- KVC是键值编码,该机制可以不通过存取方法就可以访问对象的实例变量,可以通过一个字符串的key(属性名)修改对象的属性值,
- KVO是键值监听,可以监听一个对象属性值的改变,是一种能使的对象获取到其他对象属性变化的通知机制
- 实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改他的实例变量,这样才能被观察者观察到,因此,KVC和KVO的基础或者说KVO的实现是建立在KVC的基础上的
个人理解:
KVC即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。
—(id)valueForKey:(NSString *)key;
—(void)setValue:(id)value forKey:(NSString *)key;KVO的是KeyValue Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。
addObserver:forKeyPath:options:context:;
observeValueForKeyPath:ofObject:change:context:KVO需要注意在对象销毁时,要移除观察者,不然会崩溃。
removeObserver:forKeyPath:context:
KVO是同步执行,不能执行耗时方法,KVO可能发生资源抢夺
8.类方法和实例方法的区别
类方法:
- 类方法属于类对象
- 类方法只能通过类对象调用
- 类方法中的self是类对象
- 类方法可以调用其他类方法
- 类方法中不能访问成员变量
- 类方法不能直接调用对象方法
实例方法:
- 实例方法是属于实例对象的
- 实例方法只能呢通过实例对象调用
- 实例方法中的self是实例对象
- 实例方法中可以访问成员变量
- 实例方法中直接调用实例方法
- 实例方法中野可以调用类方法(通过类名)
9.继承和扩展的区别
解答:
在 Swift 中,类
可以调用和访问超类的方法,属性和附属脚本,并且可以重写这些方法,属性和附属脚本来优化或修改它们的行为。Swift 会检查你的重写 义在超类中是否有匹配的定义,以此确保你的重写行为是正确的。
在 Swift 中,扩展
就是向一个已有的类、结构体或枚举类型添加新功能,这包括在没有权限获取原始源代码的情况下扩展类型的能力
Swift中的扩展可以:添加计算属性和计算静态属性
添加实例方法和类型方法
提供新的构造器
添加下标脚本
定义和使用新的嵌套类型区别:
- 继承可以写所有类型的属性,类别只能扩展计算性属性
- 继承可以写所有类的的构造方法,但类别只能扩展便利构造方法,不能扩展指定构造方法
参考文献
10.继承和类别的类别
回答:
类别是对一个功能完备类的补充,比如一个Animal类,具有run和eat方法,想给类增加一个bark方法,可以使用类别。
而多个类具有相同的实例变量和方法时,考虑用继承,即子类可以继承父类相同的特性,比如Animal类具有年龄和体重两个属性,Dog也具有年龄和体重两个属性,Dog就可以继承Animal的两个属性,即为继承。
共同点是都给类进行了扩展。
区别:1.类别是对方法的扩展,不能添加成员变量,继承可以在父类的成员变量基础上添加新的成员变量。
2.类别只能添加新方法,而不能修改和删除原来的方法,继承可以增加、修改和删除方法。
3.类别不提倡对原有方法进行重载,继承可以使用super对原来的方法进行重载。
4.类别可以被继承,如果一个父类中定义了一个类别,那么子类中也会继承此
11.ios7、ios8和ios9的区别
解答:
ios7中,pch文件默认是创建好的,直接使用就可以
ios8中,pch文件需要自己创建(ios——other——PCHfile)并且需要设置pch文件的路径(target ——> build setting--> 输入prefix --> Apple LLVM7.0 -Language —> Prefix Header,后和桥接头文件的设置一样)
ios9中,pch文件的创建以及路径设置和ios8中一样,但是需要在pch文件中添加一个标记
12.PCH的作用
作用:
就相当于Swift中的Swift File, 写在这里的头文件或者定义的变量可以全局访问到
格式:#ifdef __ OBJC __ (内容) #endif
内容:1.全局可使用的头文件
2.可以添加全局可用的宏定义(就相当于Swift File中的常量)
宏定义的名称最好大写,格式为#define XXXX
13.常用设计模式:MVC 、工厂、代理
MVC设计模式
MVC是一种架构模式,M表示数据模型Model,V表示视图View,C表示控制器Controller。
1、Model负责存储、定义、操作数据。
2、View用来展示数据给用户,和用户进行操作交互。
3、Controller是Model于View的协调者,Controller把Model中的数据拿过来给View使用。 Controller可以直接与Model和View进行通信,而View不能和Controller直接通信。View与Controller通信需要利用代理协议的方法,当有数据的更新时,Model也要与Controller进行通信,这个时候使用notificationhe KVO,这个方式就像一个广播,Model发射信号,Controller设置监听器接收信号,当有数据要更新时,就发信号给Controller。Model和View不能直接进行通信,因为这样就违背了MVC的设计思想。
工厂
工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
使用场景:
1、编译时无法准确预期要创建的对象的类;
2、类想让子类决定在运行时创建什么;
3、类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部;
代理
代理是一种概念,是用协议来实现的。代理是两个对象之间通讯的一种方式,代理主要做反向传值,实现系统的一些回调方法,一般用来1:1的两个对象通讯上。
14.frame和bounds的区别
- frmae
+ 以`父控件内容`的左上角的坐标为原点,计算出`控件自己矩形框`的位置的尺寸
- bounds
- 以
控件自己内容
的的左上角为坐标原点,计算出控件自己矩形框
的位置的尺寸
- 概括
- frame.size == bounds.size
- scrollView.bounds.origin == scrollView.contentOffset
用图说话:
参考文献
15.几种持久化存储的区别:plist、NSUserDefault、归档(coder)、数据库
plist文件
property list 属性列表文件,文件的内容只能是 NSString NSNumber NSDate NSData NSArray NSDictionary类的对象内容,不能保存其他类型数据。
作用: 对一些登陆注册信息或者程序的配置信息(小数据)进行持久化存储。
归档
归档(也称对象序列化,对象持久化存储)就是用某种打包格式将对象保存到本地的文件,以便以后读回该对象的内容;解档(也称归档/读档)就是把归档的对象文件,读成原来的对象的过程。
NSUserDefaults
NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使用NSUserDefaults是首选。下次再登陆的时候就可以直接从NSUserDefaults里面读取上次登陆的信息。
数据库
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称..DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
15.1. sqlite和CoreData的区别
a. 使用方便性。一个成熟的工程中一定是对数据持久化进行了封装的,因此底层使用的到底是core data还是sqlite,不应该被业务逻辑开发者关心。因此,即使习惯写SQL查询的人,也应该避免在业务逻辑中直接编写SQL语句。
b. 存储性能,在写入性能上,因为都是使用的sqlite格式作为磁盘存储格式,因此其性能是一样的。
c. 查询性能,core data因为要兼容多种后端格式,因此查询时,其可用的语句比直接使用sqlite少,因此有些fetch实际上不是在sqlite中执行的。
d. core data的一个比较大的痛点是多人合作开发的时候,管理coredata的模型需要很小心,尤其是合并的时候,它的data model是XML格式的,手动resolve比较烦心。
e. core data还有其他sql所不具备的优点,比如对undo的支持,多个context实现sketchbook类似的功能。为ManagedObject优化的row cash等。
f. 另外core data是支持多线程的,但需要thread confinement的方式实现,使用了多线程之后可以最大化的防止阻塞主线程。
16.响应者链
解答:
子控件/子视图的响应事件响应顺序:UIApplication --> window --> controller(控制器) --> 父控件(父视图)--> 子控件/子视图(第一响应者)
注意:其一父类不响应就会拦截
17.GCD
回答:
dispatch_get_global_queue 后台执行
dispatch_get_main_queue 主线程执行
dispatch_once_t 一次性执行
dispatch_time_t 延迟执行
dispatch_group_async 并行执行
dispatch_group_notify 并行执行后汇总
18.UITableView的复用机制
19.UITableView的优化
- 复用问题
- 尽量避免使用动画
- 在图片数量多的情况下,使用异步加载,并做缓存
- 自定义cell的时候直接绘制drawRect(几乎没人用)
20.内存管理
21.代理和通知的区别
22.在做友盟分享之前需要做哪些准备工作
23.友盟分享SDK的集成步骤
24.自定义分享面板的步骤
25.cocoa Pods实际上帮你了做了哪些配置
26.高德地图SDK在使用之前需要做哪些准备工作
27.高德地图SDK,定位SDK的集成步骤
28.什么是线程
29.线程和进程的区别
30.系统创建多线程的方式有哪几种,分别是什么,各自的优点
31.分别在什么情境下使用GCD和NSOperation
32.在实际项目中,什么时候回用到多线程,有什么作用
33.在使用多线程的过程中遇到过什么问题
34.viewWillAppear viewDidLoad drawRect 他们的调用顺序
35.APN的推送机制
36.苹果原生推送和极光推送的区别(极光推送相对于苹果原生推送有哪些优点)
37.APNS在推送的过程中会设计到那几个方面
38.开发者账号有哪几种?
39.支付宝、微信、银联SDK的集成步骤
40.支付宝、微信、银联支付的流程
41.支付完成之后的结果
1. 支付成功
2. 支付失败
余额不足
网络问题
用户取消支
在实际项目中,支付宝支付会跟公司自己的服务器交互
支付宝支付有客户端和h5支付两种方式,会自当判断手机客户端是否安装有支付宝客户端
42.svn的具体使用流程
43.svn有什么优缺点
44.svn和git的区别
45.CALayer和UIViewd的区别
46.UIView和UIWindow的区别
47.对Socket的理解/什么是Socket?
48.TCP和UDP的区别,各有什么优缺点
49.TCP的三次握手
50.socket通讯的步骤?
51.上线流程
52.OC中的类别区别?
定义:类别是一种为现有的类添加新方法的方式
格式: @interface 类名 (类别名) @end
局限性:
(1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。
(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。
作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
53.了解XMPP
即时通讯技术(IM -- Instant Messaging) -> 支持用户在线实时交谈
XMPP是基于XML(可扩展标记语言)的协议,以Jabber协议为基础而,用于即时消息(IM)以及在线现场探测。
XMPP是一个分散型通信网络
- 只要网络基础设施允许,任何XMPP用户都可以向其他任何XMPP 用户传递消息。
- 多个XMPP服务器可以通过一个专门的“服务器-服务器”协议相互通信,提供了创建分散型社交网络和协作框架的可能性。
- XMPP的基础架构:典型的C/S(客户端/服务端)架构。
- XMPP中定义了三个角色: 客户端、服务端、网关
- 通信能够在这三者的任意两个之间双向发生
- 服务器: 同时承担了客户端信息记录,连接管理和信息的路由功能
- 网关: 承担着与异构即时通信系统的互联互通、异构系统可以包括SMS(短信)/MSN/ICQ
- 基本网络形式: 单客户端通过TCP/IP连接到单服务器,然后在这之上传输XML流
XMPP的工作原理
- 节点连接到服务器
- 服务器利用本地目录系统中的证书对其认证
- 节点指定目标地址,让服务器告知目标状态
- 服务器查找、连接并进行相互认证
- 节点之间进行交互
传输内容
- XMPP应用传输的是与即时通讯相关的指令