iOS 面试题集-02
1、 当我们释放对象时、为什么需要调用[super delloc]方法:
1>因为子类是继承父类,那么子类中有一些实例变量(对象),是继承父类的,因此,我们需要调用父类的方法,将父类拥有的实例进行释放。
2、自动释放池是什么,如何工作:
1>自动释放放池是NSAutorelease类的一个实例,当向对象发送一个autorelease消息时,该对象会自动入池,待池销毁时,将会向池中所有对象发送一条release消息,释放对象。
3、 为什么delegate属性都用assign而不是retain:
1>防止循环引用,以至于对象无法得到正确的释放。
4、 iOS开发中的数据持久有哪几种:
1>偏好设置(NSUserDefaults)、Plist文件的写入、对象归档、splite3数据库、coreData。
5、 简述KVC和KVO:
1>、KVC(键值编码)是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量。
2>、KVO(键值观察)是一种使得对象获取到其他对象属性变化的通知机制。实现KVO键值观察模式,因此,KVC是KVO的基础或者说KVO的实现是建立在KVC的基础之上的。
6、 简述常见的设计模式:
1>单例模式、代理模式、观察者模式、工厂模式、模版方法。
7、 内存管理在dealloc释放中用release方法好还是用self.xxx=nil好:
1>用self.xxx=nil更好些,先调用release方法且将变量设置nil,这样更安全的释放,防止野指针的出现。
8、 delegate与通知Notification、block的使用区别:
1>Delegate与block一般用于两个对象一对一的通信交互,delegate需要先定义协议方法,代理对象需要实现协议方法,并且需要简历代理关系才可以实现通信。Block更加简洁、不需要定义繁琐的方法,如果通信事件比较多的话建议使用deleate。Notification主要用于一对多的情况下通信,通信对象不需要建立关系。不过使用通知,代码的可读性差。
9、 控制器ViewController的loadView\ViewDidLoad\ViewDidUnload分别是什么时候调用:
1>、loadView:当控制器的根视图view为空、且此view被访问时调用。
2>、loadView调用之后调用ViewDidLoad。
3>、iOS6.0之前,当发生内存警告时,先卸载视图、在调用ViewDidUnload来释放内存。
10、@synthesize与@dynamic属性声明的区别:
1>、@synthesize系统自动生成getter和setter属性声明。
2>、@dynamic的意思是告诉编译器,属性的获取与赋值方法由用户自实现,不能自动生成。