说明:题目在前,答案在后。希望大家看到题目的时候先思考一下答案,不要依赖答案,如果觉得答案不够具体,一定要上度娘找到自己满意的答案。代码要经常敲,题目要经常思考。如有错误,敬请雅正。
注意:每天我会推出10道面试题目,贵精不贵多,和大家一起进步。
题目:
1.什么是单例模式(singleton)
2.什么是KVC,KVO
3.什么是类别(Category),什么是扩展(Extension)
4.什么是协议代理模式(delegate)
5.什么是深拷贝和浅拷贝
6.各个属性修饰符的作用,和使用场景
7.#include和#import的区别
8.MRC下检测内存泄露的工具
9.didReceiveMemoryWarning和viewDidUnload的作用
10.你会几种反向传值方法,它们的区别是?
以下是答案:
1.什么是单例模式(singleton)
(1)概念:单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
(2)注意事项:
1)、为单例对象实现一个静态实例,并初始化,然后设置成nil,
2)、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
3)、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
4)、适当实现allocWitheZone,copyWithZone,release(MRC)和autorelease(MRC)。
(3).应用场景: 1).反向传值 2).数据库
(4)可能会遇到的特殊问法:什么是懒汉模式,恶汉模式。其实就是问的单例。
2.什么是KVC,KVO?
(1) KVC全称是Key-value coding,翻译成键值编码。顾名思义,它提供了一种使用字符串而不是访问器方法去访问一个对象实例变量的机制。(setValueWithDictionary)
JSONModel:实现的原理,通过KVC和NSRuntime去实现把一个字典变换成模型数据的过程
(2) KVO全称是Key-value observing,翻译成键值观察。提供了一种当其它对象属性被修改的时候能通知当前对象的机制。再MVC大行其道的Cocoa中,KVO机制很适合实现model和controller类之间的通讯。
实际应用:用于观察UIScrollView的contentSize或者contentOffset
MJRefreh:就是通过KVO观察UIScrollView的contentSize或者contentOffset实现
3.什么是类别(Category),什么是扩展(Extension)
Category: 用于给class及其subclass添加新的方法,有自己单独的 .h 和 .m 文件,用于添加新方法,而不能添加新属性(property)。
Extension:常被称为是匿名的Category,用于给类添加新方法,但只作用于原始类,不作用于subclass, 只能对有implementation源代码的类写Extension,对于没有implementation源代码的类。
比如framework class,是不可以的,Extension可以给原始类添加新方法,以及新属性。
4.什么是协议代理模式(delegate)
(1)出现的原因 :
因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但具体怎么做,它不关心。
(2)本质:
在被代理对象当中拥有一个弱引用指针(deletege)指向代理对象,通过这个弱应用指针可以随时向代理对象发送消息,驱动被代理对象完成代理对象需要完成的工作.
(3)可能会遇到的关联问题:
指向代理的指针(weak,assgin)可以使用强引用指针么?不可以,因为在双向代理中,会造成双向强引用.
5.什么是深拷贝和浅拷贝?
浅拷贝:简单的指针复制,新指针和旧指针指向同一片内存地址。
深拷贝:新指针和旧指针各自使用不同的内存地址。
(1)如果对一个不可变对象复制,copy是指针复制,即浅拷贝,返回不可变对象;而mutableCopy则是对象复制,即深拷贝,返回的为可变对象。
(2)如果对一个可变对象复制,始终是深拷贝。
特殊的问题:有一个不可变的数组,里面放了一个字符串对象,对这个数组发送mutableCopy消息,问拷贝之后数组内的字 符串地址是否发生变化
6.各个属性修饰符的作用,和使用场景
readonly :只读,只生成getter方法,不生成setter方法
readwrite:可读可写,缺省属性
assign:弱引用,只能修饰c的基本数据类型(int,float,double,char,char *,结构体等),不能修饰对象
retain:强引用,只能修饰对象,ARC,MRC都可使用(一般使用strong代替)
weak:弱引用,只能修饰对象,不能修饰C的基本类型,ARC专用
strong:强引用,只能修饰对象,ARC专用
copy: 强引用 ,只能修饰不可变对象
nonatomic:原子操作,简单说nonatomic就是保证多线程安全
atomic:保证多线程安全
7.#include和#import的区别:效果是相同的,只是后者不会引起交叉编译,确保头文件只会被导入一次。
8.MRC下检测内存泄露的工具:Instruments工具
9.didReceiveMemoryWarning和viewDidUnload的作用
(1)didReceiveMemoryWarning:当内存不足的时候,系统回回调此方法提示你内存不足,在此方法内部,释放不一定要内存空间(CFImageRef)。
viewDidUnload:把视图控制器上所有的子视图一并移除。
(2)Xcode 5.0以后,苹果强制使用ARC; Xcode 4.0的时候,已经有ARC机制。
10.你会几种反向传值方法,它们的区别是?
注:关于这几种传值方法,在本人已发表的文章中已详述各种传值方法及使用方法,有需要的简友们可以点击下面标签去学习。
区别:
(1)通知中心的特点是一对多,就是发送通知的是一个类,可以在很多类中接收这个通知。
(2)协议代理和block的特点就是一对一,发送者发送通知之后,只有一个类可以接收。
(3)耦合性高低排布:协议代理->block->通知中心
(4) 运行效率高低排布: block->协议代理->通知中心