1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
OC的类不可以多继承,可以实现多个接口,通过实现多个接口可以完成C++的多重继承,Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
2.类别的作用?继承和类别在实现中有何区别?
Category可以不再获悉,不改变原来代码的情况下往里面添加新的方法,只能添加不能不能删除、修改,并且如果和原来类别中的方法名称冲突,则覆盖原来的方法(类别具有更高的优先级)
作用:1)将类的实现分散到多个不同的文件或多个不同的框架中
2)创建对私有方法的前向引用
3)对象添加非正式协议
继承可以添加、修改或者删除方法并且可以增加属性。
3.浅复制和深复制的区别
浅复制:只复制指向对象的指针而不复制引用对象本身
深复制:复制引用对象本身
4.类别和类扩展的区别
类别和extensions的不同在于后者可以添加属性,另外后者添加的方法必须要实现,后者可以认为是一个私有的类别
5.何为kvo和kvc?(观察者模式)
kvc:键值编码是一种间接访问对象的属性,使用字符串来标示属性,而不是通过存取的方法,直接通过实例变量访问的机制。
eg:[self setValue:page forKeyPath:@"page"];
kvo:键值观察机制,他提供了观察某一属性变花的方法,极大的简化了代码
eg:
[request addObserver:self forKeyPath:@"page" options:
(NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld) context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if ([keyPath isEqual:@"page"])
{
trackProgress.progress=[[change objectForKey:NSKeyValueChangeNewKey]intValue]/[_bookDown.pagetotal floatValue];
}
}
6.代理的作用
代理的作用目的是改变或者传递控制链。允许一个类在某些特定时刻通知到其他的类,而不需要获取某些类的指针,减少框架复杂度,
对于代理使用assign(简单的赋值)[对于retain,copy除了赋值还会增加一次引用次数,对于delegate如果使用了retain那么就会形成相互拥有一个引用计数的局面,都不能正常释放,陷入死锁状态。
7.oc中可修饰和不可修饰的类
可和不修饰可修饰的集合类,这个我个人简单的理解就是可动态添加修改和不可动态添加修改,比如:NSArray和NSMUtableArray前者在初始化后的内存就是固定不变的后者可以添加动态,可动态申请新的内存空间。
8.#import和#include有什么区别,#import<>和#import“”又有什么区别 @class
import是oc导入的头文件的关键字#include是c/C++导入的关键字,#import会自动的导入一次,不会重复导入,不会引起交叉编译。
@class告诉编译器某个类的声明,当执行时才去看某类的执行文件,当两个类文件有循环依赖关系需要用class,在interface中引入一个类就用@class,它会把这个类作为一个类型来使用,而在实现这个inteface的文件中如果需要引用这个类的实体变量或者方法还是需要#import在@才class中声明的类。
#import<>引用系统文件,它用于系统自带的头文件的引用,编译器会在系统文件目录下查找改文件
#import“”用户自定义的文件用双引号引用,编译器首先会在用户目录下查找然后到安装目录下查找
9.类变量的@protected @private @public
@protected该类和所有子类中的方法可以直接访问这样的变量(默认)
@private该类中的方法可访问这样的变量,子类不可以
@public除了自己和子类,也可被其他类或者其他模块中的方法访问
10.id声明的对象有什么特性
id声明的对象具有运行时的特性,即可以指向任何类型的oc对象。
11.对于NSString * str=[[NSData alloc]init]str分别在编译时和运行时是什么类型的对象?
编译时是NSString 运行时是NSData
12.为什么有些5.0独有的oc函数在4.0上运行会报错,而5.0独有的类在4.0上分配内存抱错,分配的结果是什么?
运行时是因为4.0的sdk里没有对应的函数实现所以会找不到对应的@selector指针,错误而分配内存,应该是涉及到类的创建的机制上
13.auomic(原子操作)是oc使用的一种线程保护技术,防止在未完成的时候被另一线程读取,造成数据错误(耗费系统资源)
如果没有使用多线程间的通信编程那么用nonatomic
14.const
欲阻止一个变量被改变,可以使用 const 关键字。在定义该const 变量时,通常需要对它进行初
始化,因为以后就没有机会再去改变它了;
(1)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为 const,或二者同时指
定为const;
(2)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(3)对于类的成员函数,若指定其为const 类型,则表明其是一个常函数,不能修改类的成员变量;
(4)对于类的成员函数,有时候必须指定其返回值为const 类型,以使得其返回值不为“左值”。
15.线程和进程的区别?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。进程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。