Objective-C有多重继承吗?不是的话有什么替代方法?
cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理实现的
Objective-C有私有方法吗,私有变量呢?
Objectivie-C类里面的方法只有两种,静态方法和实例方法。所有实例变量默认都是私有的,所有实例方法默认都是公有的。
const作用
- 欲阻止一个变量被改变,可以使用const关键字
- 对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const
- 在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值
- 对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量
static作用
- 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值
- 在模块内的static全局变量可以被模块内所用的函数访问,但不能被模块外其他函数访问
- 在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内
- 在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝
- 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量
extern “C”的作用
- 被extern”C”限定的函数或者变量是extern类型的
- 被extern”C”修饰的变量和函数是按照C语言方式编译和连接的
#import和 #include的区别,@class呢?
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import,而#import比#include的好处就是不会引起交叉编译
objective-C的优点
- Categories
- Posing
- 动态识别
- 指标计算
- 弹性讯息传递
- 不是一个过度复杂的C衍生语言
- OC与C++可以混合编程
Objective-C的缺点
- 不支持命名空间
- 不支持运算符重载
- 不支持多重继承
- 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到
Objective-C的内存管理
- 通过分配和初始化([[MyClass alloc]init])的方式来创建对象,那就拥有这个对象,需要负责该对象的释放。这个规则在使用NSObject的便利方法new时也同样适用。
- 如果您拷贝(copy)一个对象,您也拥有拷贝得到的对象,需要负责该对象的释放。如果您保持(retain)一个对象,你就部分拥有这个对象,需要
在不再使用时释放该对象。反过来如果您从其他对象那里接收到一个对象。则您不再拥有该对象。也不应该释放它。
自动释放池是什么,如何工作
堆和栈的区别
swift新特性
MVC的理解
MVC设计模式考虑三种对象:数据模型对象,视图对象,和控制器对象。
- 数据模型:负责存储,定义,操作数据
- 视图:用来展示数据给用户,和用户进行操作交互
- 控制器: M与V的协调者,控制获取数据,将数据交给视图去展示
线程和进程
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
- 线程是进程的一个实体,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),一个线程可以创建和撤销另一个线程。
线程和进程的关系
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源
- 线程在执行过程中,需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。
- 真正在处理机上运行的是线程。
- 线程是指进程内的一个可执行单元,也是进程内的可调度实体。
线程和进程的区别
- 调度:线程作为调度和分配的基本单元,进程作为拥有资源的基本单位。
- 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
- 拥有资源;进程是拥有资源的一个独立单位,线程不拥有资源系统,但可以访问隶属于进程的资源
- 系统开销:创建或者撤销进程的开销比较大。
进程的同步机制
原子操作,信号量机制,自旋锁,分布式系统
进程的死锁原因和处理
- 原因:资源竞争以及进程推进顺序非法
- 死锁的必要条件:互斥,请求保持,不可剥夺,环路
- 死锁的处理:鸵鸟策略,预防策略,检测与解除死锁
KVC , KVO
- KVC(键值编码)是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量。
- KVO(键值观察)是一种能使得对象获取到其他对象属性变化的通知机制。
- 实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVC是KVO的基础或者说KVO的实现是建立在KVC的基础之上。
深复制,浅复制
- 深复制:不仅复制对象本身,对象持有的属性对象也做复制
- 浅复制:只复制对象本身,不对里面的属性复制
定义属性使用 assign, retain, copy, nonatomic
- assign: 普通赋值,一般用于基本数据类型,常见委托设计模式,以此来防止循环引用
- retain: 保留计数,获得了对象的所有权,引用计数在原有基础上加1
- copy: 一般字符串使用copy,Foundation中的不可变对象使用copy效果相当于retain,只是引用计数 +1
- nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.
strong , weak , _unsafe, _unretained
- strong叫强引用,weak叫弱引用,在arc中,使用strong告诉编译器自动插入retain,weak相当于手动管理内存的assign.
- _unsafe,_unretained 与weak功能一致,区别在于当指向的对象销毁后,weak会讲变量置为nil,防止调用野指针。
ARC存在内存泄露吗
循环引用导致内存泄露,OC对象与CoreFoundation类之间桥接时管理不当也会产生内存泄露。
事件响应者链
- 响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者(next responder)
- View -> ViewController -> Window -> application ->丢弃事件