1.简述你对UIView、UIWindow和CALayer的理解
UIView:属于UIkit.framework框架,负责渲染矩形区域的内容,为矩形区域添加动画,响应区域的触摸事
件,布局和管理一个或多个子视图
UIWindow:属于UIKit.framework框架,是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。UIWindow在程序中主要起到三个作用:
1、作为容器,包含app所要显示的所有视图2、传递触摸消息到程序中view和其他对象3、与
UIViewController协同工作,方便完成设备方向旋转的支持
CAlayer:属于QuartzCore.framework,是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处 理用户事件。UIView和CALayer是相互依赖的,UIView依赖CALayer提供内容,CALayer依赖UIView一共容器显示 绘制内容。
UIViewController:管理视图的几成熟,每个视图控制器都有一个自带的视图,并且负责这个视图相关的一切事务。方便 管理视图中的子视图,负责model与view的通信;检测设备旋转以及内存警告;是所有视图控制类的积累,定义了控制器 的基本功能
2. 写一个完整的代理,包括声明,实现
(略)
3.分析json、xml的区别?json、xml解析方式的底层是如何处理的?
简言之:
json数据小,易解析,不复杂 xml数据较大,比较复杂
json中以key/value形式保存,大多数是字典数组模式
xml中则是<> 节点
详细来说:
(1)可读性方面:基本相同,xml的可读性比较好
(2)可扩展性方面:都具有很好的扩展性
(3)编码难度方面:相对而言:JSON的编码比较容易
(4)解码难度:json的解码难度基本为零,xml需要考虑子节点和父节点
(5)数据体积方面:json相对于xml来讲,数据体积小,传递的速度跟快些
(6)数据交互方面:json与JavaScript的交互更加方面,更容易解析处理,更好的数据交互
(7)数据描述方面:xml对数据描述性比较好(8)传输速度方面:json的速度远远快于xml
JSON底层原理:遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}号,[]号, : 号 等进行区分,{}号是一个字典 的开始,[]号是一个数组的开始, : 号是字典的键和值的分水岭,最终乃是将json数据转化为字典,字典中值可能是字典,数 组,或字符串而已。
XML底层原理: XML解析常用的解析方法有两种:DOM解析和SAX解析。
DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
DOM 解析把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。使用 DOM 解析器的时候需 要处理整个 XML 文档,所以对性能和内存的要求比较高。
SAX在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag 的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决 定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。
4. ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
1)当应用程序的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,程序收到内存警告时候ViewController会调用didReceiveMemoryWarning这个方法。
2)调用了这个方法之后,对view进行释放并且调用viewDidUnload方法
3)从iOS3.0开始,不需要重载这个函数,把释放内存的代码放到viewDidUnload中去。
5.面向对象的三大特征,并作简单的介绍
封装、继承、多态
封装:将一个实例的所有属性封装到某个类中
继承:子类继承父类所有方法和属性
多态:父类指针指向子类对象
6. 简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?
NotificationCenter:任何对象可以发送通知到中心,同时任何对象可以监听中心的通知。
优点: 通知的发送者和接受者都不需要知道对方。可以指定接收通知的具体方法。通知名可以是任何字符串。
缺点: 较键值观察需要多点代码。在删掉前必须移除监听者。不能传大量数值,只能让谁去做什么事。
KVC,即是指 NSKeyValueCoding,键值编码。提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问
KVO的是KeyValue Observe的缩写,键值观察。这是一个典型的观察者模式,观察者在键值改变时会得到通知。
Delegate:多用于两个类之间的传值,效率比NSNotification高
7.懒加载
又称延迟加载,按需加载。
只在用到的时候才去初始化
8. 什么是Protocol?什么是代理?写一个委托的interface?委托的property声明用什么属性?为什么?
协议,用来在两个ViewController交互时所定的协议。
代理,第三方中介
weak 或者 assign ,防止循环引用
9.分别描述类目(categories)和延展(extensions)是什么?以及两者的区别?继承和类目的实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
类目:主要作是为没有源代码的类添加法 。通过Category添加的法会成为原类的部分。从达到扩展个类的功能。
延展:主要作是给某类添加私有方法或是私有变量,延展可以认为是一个私有的类目。
两个的区别:延展可以添加属性并且它添加的方法是必须要实现的。
继承和类别在实现中的区别:类别可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
Category只能为对象添加方法,却不能添加成员变量的原因:如果可以添加成员变量,添加的成员变量没有办法初始化----这是语言规则