一.网络基础
1.数据解析
1> XML解析方式SAX 方式解析-只读-速度快-从上向下-通过5个代理方法解析,每个代理方中都需要写一些代码!-如果要实现SAX解析,思路最重要!-适合比价大的XML的解析DOM解析的特点-一次性将XML全部加载到内存,以树形结构-好处,可以动态的修改,添加,删除节点-内存消耗非常大!尤其横向节点越深!-iOS默认不支持 DOM 解析!-在 MAC 端,或者服务器端开发,都基本上使用 DOM 解析-在 iOS 端如果需要使用 DOM 方式解析,可以使用第三方框GData/KissXML(XMPP)-适合比较小的 XML 文件-在 MAC 中,苹果提供了一个 NSXML 的类,能够做 DOM 解析,在 iOS 不能使用!
2> json&xml的区别
1)解码难度: json的解码难度基本为零,xml需要考虑子节点和父节点
2)数据体积&传输速度: json相对于xml来讲,数据体积小,json的速度远远快于xml
3)数据交互: json与JavaScript的交互更加方面,更容易解析处理,更好的数据交互
4)数据描述: xml对数据描述性比较好
2.网络协议
1>TCP如何防止乱序和丢包 TCP数据包的头格式中有两个概念,Sequence Number是数据包的序号,用来解决网络包乱序(reordering)问题。Acknowledgement Number就是ACK——用于确认收到,用来解决不丢包的问题。 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码). SeqNum的增加是和传输的字节数相关的,TCP传输数据时,A主机第一次传输1440个字节,seq=1,那么第二次时seq = 1441,B拼接数据就是根据seq进行拼接的,seq数字不断累加避免了乱序.B主机收到第一次数据包以后会返回ack = 1441. A主机收到B的ack = 1441时,就知道第一个数据包B已收到. 如果B没有收到第一次的数据包,那么B再收到A的数据包时,他就会发ack = 1回去,A收到B的回复,发现B没有收到第一次数据包,就会重发第一次数据包,这样就可以防止丢包.
2>描述一下三次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据.
3> TCP与UDP的区别:
3.1>基于连接与无连接;
3.2>对系统资源的要求(TCP较多,UDP少);
3.3>UDP程序结构较简单;
3.4>流模式与数据报模式 ;
3.5>TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。
4>http和scoket通信的区别
http是客户端用http协议进行请求,发送请求时候需要封装http请求头,并绑定请求的数据,服务器一般有web服务器配合(当然也非绝对)。 http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接,以节省资源。服务器不能主动给客户端响应(除非采取http长连接技术)。iPhone主要使用类是NSUrlConnection。
scoket是客户端跟服务器直接使用socket“套接字”进行连接,并没有规定连接后断开,所以客户端和服务器可以保持连接通道,双方都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用。主要使用类是CFSocketRef。
5> HTTP请求常用的几种方式GET :获取指定资源POST :2M 向指定资源提交数据进行处理请求,在RESTful 风格用于新增资源HEAD :获取指定资源头部信息PUT :替换指定资源(不支持浏览器操作)DELETE: 删除指定资源
3.网络传输
1>DNS是如何工作的DNS是domain name server的简称,每个网络的计算机都有ip,但是不好记,所以用域名替代(如www.baidu.com),在 Internet 上真实在辨识机器的还是 IP,所以当使用者输入Domain Name 后,浏览器必须要先去一台有 Domain Name 和IP 对应资料的主机去查询这台电脑的 IP,而这台被查询的主机,我们称它为 Domain Name Server,简称DNS,例如:当你输入www.pchome.com.tw时,浏览器会将www.pchome.com.tw这个名字传送到离他最近的 DNS Server 去做辨识,如果查到,则会传回这台主机的 IP,进而跟它索取资料,但如果没查到,就会发生类似 DNS NOT FOUND 的情形,所以一旦DNS Server当机,就像是路标完全被毁坏,没有人知道该把资料送到那里
2> POST请求常见的数据格式
二.网络安全/加密
三.数据存储
1.数据存储技术
1> 数据存储的几种方式 XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3Core Data
2> 各自特点
Plist:属性列表是一种XML格式的文件,拓展名为plist如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中 将一个NSDictionary对象归档到一个plist属性列表中
// 将数据封装成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"母鸡" forKey:@"name"];
// 将字典持久化到Documents/stu.plist文件中
[dict writeToFile:path atomically:YES];
面试考点:
1. plist的根节点 只能是NSDictionary和NSArray,所以存储内容必须转为对象类型
2. 使用场景 功能动态更新 应用级别数据更新 XML的替代品 偏好设置:每个应用都有个NSUserDefaults实例,通过它来存取偏好设置比如,保存用户名、字体大小、是否自动登录
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[defaults setObject:@"itcast" forKey:@"username"];[defaults setFloat:18.0f forKey:@"text_size"];
[defaults setBool:YES forKey:@"auto_login"];
面试考点:
1. 使用场景 保存应用信息
2. 特点 不会自动删除,itune同步,不适合存大数据
3. 使用单例模式、
4. 直接存取结构体,基本数据类型,无需转换
5. 即时操作注意同步
归档:如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以NSCoding协议有2个方法:
encodeWithCoder:每次归档对象时,都会调用这个方法。
一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量initWithCoder:每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量归档一个NSArray对象到Documents/array.archiveNSArray *array = [NSArray arrayWithObjects:@”a”,@”b”,nil];[NSKeyedArchiver archiveRootObject:array toFile:path]; 使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象 归档(编码)
// 新建一块可变数据区NSMutableData *data = [NSMutableData data];
// 将数据区连接到一个NSKeyedArchiver对象NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
// 开始存档对象,存档的数据都会存储到NSMutableData中[archiver encodeObject:person1 forKey:@"person1"];[archiver encodeObject:person2 forKey:@"person2"];
// 存档完毕(一定要调用这个方法)[archiver finishEncoding];
// 将存档的数据写入文件[data writeToFile:path atomically:YES]; l 恢复(解码)// 从文件中读取数据NSData *data = [NSData dataWithContentsOfFile:path];
// 根据数据,解析成一个NSKeyedUnarchiver对象NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];Person *person1 = [unarchiver decodeObjectForKey:@"person1"];Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
// 恢复完毕[unarchiver finishDecoding]; 利用归档实现深复制NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
// 解析data,生成一个新的Person对象Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
面试考点:
1. 特点: 存入Document,itune同步,不会自动删除,可存放大型用户数据
2. 使用场景: 用户产生的数据,如游戏,操作记录等等
3. 可保存自定义对象,需要遵守NSCoding协议,实现对应的encodeWithCoder initWithCoder 方法
4. 和NSData的配合4.1> 多对象单目录存储4.2> 字典/数组内容的深拷贝5. 不能直接存基本类型和结构体,需要转成对象 NSValue NSNumber
2> 沙盒目录结构
2.1> Library Caches Preferences
2.2> Documents2.3> tmp
3> 如何读取沙盒中plist的内容1>
3.1> 读取沙盒并拼接plist的文件路径 NSString *path = [[NSBundle mainBundle] pathForResource:@"app.plist" ofType:nil]; 3.2> 根据plist根节点类型读取plist文件NSArray *apps = [NSArray arrayWithContentsOfFile:path];
2.数据库技术(SQLite&CoreData)
1> SQLite和CoreData的区别
1.1> CoreData可以在一个对象更新时,其关联的对象也会随着更新,相当于你更新一张表时,其关联的其他表的也回随着更新
1.2> CoreData提供更简单的性能管理机制,可以限制查询记录的总数,这个类会自动更新其缓存
1.3> 多表查询方面,CoreData没有SQL直观,没有类似外连接,左连接等操作.
四.Html5/oc&js互调
oc>js:[self.webView stringByEvaluatingJavaScriptFromString:“window.location.href = xxx”];js>oc: 利用hmtl中js的重定向技术,window.location.href = www.baidu.com//method:dosomething使用方法截取重定向(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
五.iOS网络框架
1> NSURLConnection和NSURLSession的区别
1.1> 异步请求不需要NSOperation包装
1.2> 支持后台运行的网络任务(后台上传下载)
1.3> 根据每个Session做配置(http header,Cache,Cookie,protocal,Credential),不再在整个App层面共享配置
1.4> 支持网络操作的取消和断点续传(继承系统类,重新main方法)
1.5> 改进了授权机制的处理
项目
1.实用技术
2.知名第三方框架
3.开发技巧
1> description方法
Swift
1> Swift和OC的区别
1.1> Swift没有地址/指针的概念
1.2> 泛型
1.3> 类型严谨 对比oc的动态绑定
6.设计模式
1> 常用的设计模式 代理 观察者 工厂 单例 策略
2> 代理属性的内存策略是什么,为什么?
3> 观察者模式的使用场景
4> 工厂模式(类方法)为什么没有释放对象? autorelease工作原理? arc下还需要手动使用autorelease吗?为什么?什么场景?
5> 手写单例
6> 策略 cell多种响应效果 代理方法
(一)代理模式
应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。
优势:解耦合 敏捷原则:开放-封闭原则
实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。
列表row个数delegate
自定义的delegate
(二)观察者模式
应用场景:一般为model层对controller和view进行的通知方式,不关心谁去接收,只负责发布信息。
优势:解耦合 敏捷原则:接口隔离原则,开放-封闭原则
实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。
kvo,键值对改变通知的观察者,平时基本没用过。
(三)MVC模式
应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。
优势:使系统,层次清晰,职责分明,易于维护 敏捷原则:对扩展开放-对修改封闭
实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。
(四)单例模式
应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
优势:使用简单,延时求值,易于跨模块
敏捷原则:单一职责原则
实例:[UIApplication sharedApplication]。
注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。
java,C++中使其没有公有构造函数,私有化并覆盖其构造函数。
object c中,重写allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例,返回的也只是此单例类的唯一静态变量。
(五)策略模式
应用场景:定义算法族,封装起来,使他们之间可以相互替换。
优势:使算法的变化独立于使用算法的用户
敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。
实例:排序算法,NSArray的sortedArrayUsingSelector;经典的鸭子会叫,会飞案例。
注意事项:
1,剥离类中易于变化的行为,通过组合的方式嵌入抽象基类
2,变化的行为抽象基类为,所有可变变化的父类
3,用户类的最终实例,通过注入行为实例的方式,设定易变行为 防止了继承行为方式,导致无关行为污染子类。完成了策略封装和可替换性。
(六)工厂模式
应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。
优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。
敏捷原则:DIP依赖倒置原则 实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换
注意事项:项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式,因为其劣势也很明显, 增 加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥用。
2> MVVM和rectivecocoa