1、KVO内部实现原理?
①.KVO是基于runtime机制实现的。
②.当某个类的对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。
派生类在被重写setter方法中实现了真正的通知机制。(Person->NSKVONotification Person)
2、自动释放池如何实现?
自动释放池以栈的形式实现,当你创建一个新的自动释放池时,它将被添加到栈顶,当一个对象收到发送autorelease消息时,它将添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收时,它们从栈中被删除并且会给池子里所有对象都做一次release操作。
3、block在ARC中和MRC中的方法有何区别?需要注意什么?
①.对于没有引用外部变量的Block,无论在ARC还是MRC下,类型都是NSGlobalBlock,这种类型的block可以理解为一种全局的block,不需要考虑作用域的问题。同时,对它进行Copy和Retain操作也是无效的。
②.避免循环引用。
根据isa指针,block一共有3种类型的block
_NSConcreteGlobalBlock
全局静态
_NSConcreteStackBlock
保存在栈中,出函数作用域就销毁
_NSConcreteMallocBlock
保存在堆中,retainCount == 0销毁
4、非自动内存管理情况下怎么做单例模式。
创建一个单例对象的静态实例,并初始化为nil。
创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个类的实例。
实现NScopying协议,覆盖allocWithZone:方法,确保用户在直接分配对象时,不会产生另一个对象。
覆盖release、autorelease、retain、retainCount方法,确保单例的状态。
5、cocoa和cocoa touch?
cocoa包含Foundation和AppKit框架,可用于开发Mac
OS X系统的应用程序
cocoa touch包含Foundation和UIKit框架,可用于开发iPhone OS 系统的应用程序
Cocoa时Mac OS X的开发环境,cocoa Touch是Iphone OS的开发环境
6、介绍一下XMPP?
基于XML的点对点通讯协议,实现通讯功能.
优点:可以跨平台开发.
缺点:丢包,只能发文字(图片发送发的是链接).
7、简述对UIView.UIWindow和CALayer的理解.
UIWindow是应用的窗口,继承于UIResponder.
UIView继承于UIView,是创建窗口中的一个视图,可以响应交互事件.一个程序只有一个主window,可以有多个window.
CALayer图层,一个view可有多个图层,不可以响应事件.
8、iOS类是否可以多继承,如果没有,怎么实现?
不可以多继承.
可以通过类目,延展,协议实现多继承.
类目:类目也叫分类,英文category,在没有原类.m文件的基础上,给该类添加方法.类目里不能添加实例变量,不能添加和原始类方法名相同的方法,否则会发生覆盖.一个类可以添加多个类目,类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承.
延展:Extension,是一种特殊形式的类目,主要是在一个类的.m里面声明与实现.作用:就是给某类添加私有方法或者私有变量.
虽然延展是给一个类定义私有方法,但是OC没有绝对的私有方法,其实还是可以调用的,延展里面声明的变量只能在该类内部使用,外界访问不了.如果是新建文件建的的某类延展.h文件,则不能添加实例变量,如果括号里没有类目名,则认为延展里面的方法为全都必须实现,如果有,则可选实现.
类目写的方法必须实现,延展写的方法非必须.
9、线程同步和异步的区别?ios中如何实现线程的同步?
同步:任务顺序执行,下一个任务依赖于上一任务的完成.
异步:任务执行顺序不定,一起执行.
实现:设置依赖:NSOpreationQueue GCD中的串行队列.
10、ios 平台怎么做数据的持久化?coredata 和sqlite有无必然联系?coredata是一个关系型数据库吗?
答:iOS 中可以有四种持久化数据的方式:属性列表(plist)、对象归档、SQLite3 和Core Data;core data 可以使你以图形界面的方式快速的定义app 的数据模型,同时在你的代码中容易获取到它。coredata 提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app 中继续创建新的任务。在使用core data 的时候,你不用安装额外的数据库系统,因为core data 使用内置的sqlite 数据库。core data 将你app 的模型层放入到一组定义在内存中的数据对象。coredata 会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。当core data 在对你app 数据的改变进行保存的时候,core data 会把这些数据归档,并永久性保存。mac os x 中sqlite 库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。可以在多个平台使用,sqlite 是一个轻量级的嵌入式sql 数据库编程。与core data 框架不同的是,sqlite 是使用程序式的,sql 的主要的API 来直接操作数据表。Core Data 不是一个关系型数据库,也不是关系型数据库管理系统(RDBMS) 。虽然Core Dta 支持SQLite 作为一种存储类型,但它不能使用任意的SQLite 数据库。Core Data 在使用的过程种自己创建这个数据库。Core Data 支持对一、对多的关系。
11、死锁的4个必要条件
答:互斥、请求保持、不可剥夺、环路
12、 KVO内部实现原理
KVO是基于runtime机制实现的
当某个类的对象第一次被观察时,
系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的
setter 方法。
派生类在被重写的setter 方法实现真正的通知机制(Person NSKVONotifying_Person)