1. OC语言的基本特点
OC语言是C语言的一个超集,只是在C的基础之上加上了面向对象(oo)的特性;
OC与Java语言相同都是单继承,这一点与C++语言不同(多重继承);
OC不支持命名空间机制,取而代之的是在类名之前添加前缀,以此来区分。
2. #include与#import的区别、#import与@class的区别
(1)#include与#import的区别:#include和#import其效果相同,只是后者不会引起交叉编译,确保头文件只会被导入一次。
(2)#import与@class的区别:import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。使用#import编译效率高,防止相互包含的编译错误!
3. 简述类目优点和缺点,如果覆盖本类或者父类的方法,会出现什么问题?
(1)优点:不需要通过增加子类而增加现有类的行为(方法),且类目中的方法与原始类方法基本没有区别
(2)缺点:无法向类目添加实例变量。覆盖原始类方法后,原始类的方法没办法调用
4. 简述内存管理基本原则
如果使用alloc、copy(mutableCopy)或者retain一个对象时,你就有义务,向它发送一条release或者autorelease消息。其他方法创建的对象,不需要由你来管理内存。
5. 什么是ARC技术?与GC是否相同?
ARC是Automatic Reference Counting的简称,我们称之为自动引用计数,是iOS5.0之后推出的内存管理的新特性。本质上还是使用引用计数来管理对象,只是我们在编写代码时,不需要向对象发送release或者autorelease方法,也不可以调用delloc方法,编译器会在合适的位置自动给用户生成release消息(autorelease)。GC的全称是garbage collection,内存垃圾回收机制,ARC比GC性能好!
6. 内存中的堆区和栈区的差别
栈区(stack)由编译器自动分配释放,存放方法(函数)的参数值,局部变量的值等,堆区(heap)一般由程序员分配和释放,程序员不释放,则内存溢出
7. 定义属性时,什么时候用assign、retain、copy、nonatomic
(1)assign:普通赋值,一般常用于基本数据类型,常见委托设计模式,以此来防止循环引用。
(2)retain:保留计数,获得对象的所有权。引用计数在原有基础上面加1。
(3)用来复制对象,一般字符串使用copy,Foundation 中的不可变对象使用copy效果相当于retain,只是引用计数+1。
(4)nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能
8. strong 与weak , _unsafe_unretained与weak的区别
(1)strong叫强引用,weak 叫弱引用,在ARC中,使用strong告诉编译器帮助我们自动插入retain,weak是普通赋值相当于手动管理内存的assign,
(2)_unsafe_unretained与weak功能一致,区别在于当指向的对象销毁后,weak会将变量置为nil,防止调用野指针。
9. ARC存在内存泄露吗?
ARC中如果内存管理不当的话,同样会存在内存泄露,例如:ARC中也会循环引用导致内存泄露,OC对象与CoreFoundation类之间桥接时,管理不当也会产生内存泄露
10. 当我们释放对象时,为什么需要调用[super dealloc]方法?
因为子类是继承自父类,那么子类中有一些实例变量(对象),是继承自父类的,因此,我们需要调用父类方法,将父类所拥有的实例进行释放。
11. iOS开发中数据持久性,有哪几种?
plist文件写入,对象归档,sqlite3数据库、coredata
12. 什么是KVC 和 KVO ?以及它们之间的关系是什么?
(1)KVC(键值编码)是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量
(2)KVO(键值观察)是一种能使得对象获取到其他对象属性变化的通知机制。
(3)实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVC是KVO的基础或者说KVO的实现是建立在KVC的基础之上的。
13. 简述常见的设计模式
单例设计、代理设计、观察者(通知)、工厂方法、模板方法
14. 内存管理 在dealloc 方法中 用realease方法好还是用self.xxx=nil 好?
使用self.xxx = nil 更好,因为先调用了realease方法,而且还将变量设置为nil,这样就更安全的释放对象,防止野指针调用
15. 线程与进程的区别和联系?
一般的应用程序是单个进程,也有多进程(谷歌浏览器),进程是个静态的容器,里面容纳了很多个线程,线程是一系列方法的线性执行路径。
16. OC语言的优缺点:
(1)优点:类目、动态识别、支持C语言、OC与C++可以混编
(2)缺点:不支持命名空间、不支持运算符重载、不支持多重继承
17. 代理delegate与通知Notification、block的使用区别
delegate与block一般是用于两个对象1对1之间的通信交互,delegate需要定义协议方法,代理对象实现协议方法,并且需要建立代理关系才可以实现通信。block更加简洁,不需要定义繁琐的协议方法,但是如果通信事件比较多的话,建议使用delegate。Notification主要用于1对多情况下通信,而且通信对象之间不需要建立联系!但是使用通知代码可读性差。
18. 控制器ViewController的loadView,viewDidLoad,viewDidUnload分别是在什么时候调用的?
(1)loadView调用:当控制器的根视图view为空,且此view被访问时则调用
(2)loadView调用之后调用viewDidLoad
(3)iOS6.0之前,当内存警告时,先卸载视图,再调用ViewDidUnload来释放内存
19. @synthesize 和 @dynamic 的区别
(1)@synthesize 是系统自动生成getter 和setter属性声明
(2)@dynamic 的意思是告诉编译器,属性的获取与赋值方法由用户自己实现,不自动生成。
20. 事件响应者链的概念
响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件将沿着响应者链向上传递,交给下一个响应者(next responder)。一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,如果它不处理,事件就会被传递给它的视图控制器对象(如果存在),然后是它的父视图(superview)对象(如果存在),以此类推,直到顶层视图。接下来会沿着顶层视图(top view)到窗口(UIWindow对象)再到程序(UIApplication对象)。如果整个过程都没有响应这个事件,该事件就会被丢弃。一般情况下,在响应者链中只要由对象处理事件,事件就停止传递。但有时候可以在视图的响应方法中根据一些条件判断来决定是否需要继续传递事件。
21. C语言中static变量和static函数有什么作用?
(1)表示变量是静态存储变量,表示变量存放在静态存储区
(2)加在函数前面的时候表示该函数是内部连接,只在本文件中有效,别的文件中不能应用该函数。
网友评论