这算是在简书上的处女作,说说今天的面试经历,顺便把面试中的问题总结一下,方便之后面试的同时,也展示一些此公司的面试流程及内容。其实这家公司算是中上等的公司。
先是笔试:
1、简述iOS开发中有哪些常用的消息传递机制(答案网上大批的有)
KVO:(key-value-observing)提供对象属性被改变时的通知机制
Delegate(委托):苹果内部的框架中使用很广泛,让我们自定义对象行为,只需要发送者知道接收者即可
NSNotification(通知):两个不相关的模块通信传递消息时,通知机制是非常好的工具。
Block:是一个回调
2、简述MRC和ARC?
MRC:就是手动引用计数,需要程序员自己来申请地址空间,并且自己操作其释放,
遵循的法则是:谁创建,谁释放;谁引用,谁释放
ARC:就是自动引用计数,系统自动操作。
3、简述autorelease pool的工作原理?
本质上就是一个延迟调用release。只能解释到这。若想有更深的了解请参考如下网址:
http://blog.csdn.net/hengshujiyi/article/details/46349073
4、手写一个Singleton
5、简述kvo和kvc的区别?
KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。KVO 就是基于 KVC 实现的关键技术之一。
KVO的是KeyValue Observe的缩写,中文是键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。iOS中有个Notification的机制,也可以获得通知,但这个机制需要有个Center,相比之下KVO更加简洁而直接。
6、简述oc中的数据存储方式?
1、沙盒 2、plist 3、preference(偏好设置用NSUserDefault实现) 4、NSKeyArchieve 5、FMDB(对sqlite的封装) 6、coreData
7、property属性的修饰符有什么样的作用
getter=getName、setter=setName:设置setter与getter的方法名
readwrite、readonly:设置可供访问级别
assign:方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
retain:其setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序
copy:其setter方法进行copy操作,与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
nonatomic:非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。
8、obj在编译时和运行时分别时什么类型的对象
如下面的代码,obj在编译时和运行时分别时什么类型的对象:
NSString*obj=[[NSDataalloc]init];
参考答案:
在编译时,我们所声明的obj是NSString *类型,因此是NSString类型对象。在运行时,由于指针obj所指向的是NSData类型对象的内存,因此实际上是NSData类型的对象。在编译时,这一行代码会转换成类似这样:
NSString*obj=((id(*)(id,SEL))objc_msgSend)([NSDataclass],@selector(alloc));
obj=((id(*)(id,SEL))objc_msgSend)((id)obj,@selector(init));
由于在编译时,转换成id,因此可以用NSString *指向NSData对象,而id是具备运行时特性的,因此在链接时,通过id的isa指针可以找到其所属的类,因此最终类型还是通过isa确定其所属类型。
9、关于socket
http://www.henishuo.com/ios-socket-theory/
10请把字符串“2015-2-14”转化为NSData类型
NSString *str = @"2015-2-14";
NSDateFormatter *format = [NSDateFormatter alloc]init];
format.dateFormat = @"yy-mm-dd";
format.timeZone = [NSTimeZone defaultTimeZone];
NSDate *date = [NSDate dateFromString:str];
NSLog(@"%@",date);