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(nsmutablecopy)或者retain一个对象时,你就有义务,向它发送一条release或者autorelease消息。其他方法创建的对象,不需要由你来管理内存。
5、什么是arc技术?与GC是否相同?
arc是Automatic reference counting的简称,我们称之为自动引用技术,是ios5.0之后推出的内存管理的新特性。本质上还是使用引用计数来管理对象,只是我们在编写代码时,不需要向对象发送release或者autorelease方法,也不可以调用delloc方法,编译器会在适合的位置自动给用户生成release消息(autorelease)。GC的全称是garbage collection,内存垃圾回收机制,arc比gc性能好。
6、ios中是否支持垃圾回收机制
ios开发只支持手动内存管理与arc,mac开发支持gc垃圾回收机制,10.8之后弃用了gc,推荐使用arc
7、深、浅复制的基本概念以及他们的区别
浅复制:只复制对象本身,不对里面的属性复制
深复制:不仅复制对象本身,对象持有的属性对象也做复制
8、内存中的堆区和栈区的差别
栈区 有编译器自动分配释放,存放方法的参数值,局部变量的值等,堆区一般由程序员分配与释放,若程序员不释放,则内存溢出。
9、用户自定义了一个对象,如何实现拷贝(可变和不可变拷贝)
必须实现copying和mutablecopying协议,表示返回一个不可变和可变的对象。否则,程序将会出现异常。
- (id)copyWithZone:(NSZone *)zone{
Person *person = [[self class] allocWithZone:zone];
person ->age = self.age;
person ->name = self.name;
return person;
}
- (id)mutableCopyWithZone:(NSZone *)zone;
10、定义属性时,什么时候用assign、retain、copy、nonatomic
(1)assign:普通赋值,一般常用于基本数据类型,常见委托设计模式,以此来防止循环引用。
(2)retain:保留计数,获得了对象的所有权。引用计数在原有的基础上加1.
(3)copy:用来复制对象,一般字符串使用copy,Foundation中的不可变对象使用copy效果相当于retain,只是引用计数+1
(4)nonatomic,非原子访问,不加同步,多线程并发访问会提高性能。