1.Difference between shallow copy and deep copy? 浅复制和深复制的区别?
浅复制:仅复制指向对象的指针,而不复制引用对象本身。 深复制:复制指针的同时还复制指针指向的对象本身。
区别是:
浅复制之后的两个指针指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源 还是只有一份,
深复制之后两个指针各自指向一个内存资源,把内存资源复制了一份,内存中有两份资源
2.What is advantage of categories? What is difference between implementing a category and inheritance? 类别的作用?继承和类别在实现中有何区别?
区别:(也就是类别具有而子类不具有的特点)
1.类别可以在不获悉,不改变源代码的情况下往里面添加新的方法,只添加,不能删除修改。2. 类别方法具有最高优先级,会完全覆盖同名方法,原方法将不可以再访问
3.类别可以将类的实现模块化到多个模块中。
4.系统中已经存在的对类的引用在使用类别扩展类以后可以不必发生变化就能继续引用。
5.实现了功能的局部化封装,没有包含的类别模块不会被引用
6.轻巧。很多时候,对已存在的类所需的扩展仅仅是几个新方法。这时,用类别避免了在系统中留下很多非常短小的“微”子类,使程序更加紧凑。
对应的,继承的特点是:
1.需要获悉源代码才能产生子类,可以增删改父类方法作为子类自己的方法2.和父类的同名方法将同时存在,通过super调用父类的同名方法
3.实现必须在同一个.m文件中
4.对原来类的引用名称必须全部改为对子类的引用
5.总是整体封装的。
6.子类过多使用会在系统中留下很多非常短小的微子类。
类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。 (2)创建对私有方法的前向引用。 (3)向对象添加非正式协议。 继承可以增加,修改或者删除方法,并且可以增加属性。
扩展适用于添加的数据和方法仅供类本身适用的情况,可以看作私有类别。具有三个特点:
1.扩展相当于一个匿名分类,它可以添加实例变量(属性也就可以了)。
2.扩展中添加的方法一定要在主类的实现部分实现。
3.扩展添加的方法都是私有方法(所以通常扩展都是放到主类的实现部分)
4.Difference between protocol in objective c and interfaces in java? obc中的协议和java中的接口概念有何不同?
协议包括两部分“必须实现(@requied)”和“可选实现(@optional)”的两种,接口相当于必须实现的协议
非正式协议只是一种建议,属于特别的类别,认为其中定义的方法比原来更好。
5.What are KVO and KVC?
KVC:利用键值(string)来访问属性的机制,即使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
很多情况下可以简化程序代码。
KVO提供一种机制,当指定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。KVC(键值编码)使KVO更容易实现,简化代码
6.What is purpose of delegates? 代理的作用?
7.oc内存管理机制是怎么样的?什么是autoreleasePool,作用是什么?如何实现(原理)?
oc本质上是c语言的手动管理内存机制,只不过稍微加了一些自动的方法,自动释放池。
autoreleasePool是一个内存自动释放池,
优点:作用是延迟对象的release时间,从而避免完全手动管理情况下频繁的申请和释放内存。有些对象如函数返回对象,并不清楚什么时候释放它们,所以用autorelease
,从而使调用者不用考虑被调用者申请的内存,满足谁申请谁释放的原则
缺点:在iphone/ipad等内存有限的手持设备上,并不建议 使用autorelease,因为说到底这是一种延时释放,如果你的程序一直在跑,代码尚未执行到[pool release]之前,即使有很多对象不再需要了,但它们占用的内存并未真正释放。
所有autoreleasePool通过一个栈结构组织,在进入每一个runloop的时候会在栈顶创建一个新的pool,所有使用autorelease声明的对象都会加入当前pool。
在退出runloop的时候,当前栈顶pool被销毁,其中的所有对象会执行一个release操作。
8.