(1)宏定义#define
与类型定义符typedefine
的区别:
#define
:文本的简单替换。预处理阶段被处理,不涉及C语法,所以没有作用域一说,可出现在文件的任何位置;
typedefine
:为已有类型起别名,有作用域。形式上与变量的声明“类型名 变量标识符”类似,“typedefine 类型名 新类型名标识符”;
(2)为了防止类名冲突,Java:引入“包”的概念,OC:引入“NS”前缀;
(3)为了防止与C/C++关键字的冲突:OC的关键字均以@
开头!
(4)为了防止与C/C++字符串的冲突:OC的字符串均以@
开头。C/C++的字符串形式:"xxxx",OC:@"xxxx";
(5)OC中有BOOL类型,取值为YES(1)/NO(0);Java中取值为True/False。
(6)关于“空”:OC中为nil,Java中为null,C中为NULL;
(7)在OC中打印一个对象时,格式符为“%@”,它默认会调用description方法;
(8)内存管理的对象和原则: MRC时代(alloc/new/copy,retain/release/autorelease);
(9)数组/字典等集合对象中只能存放OC对象,不能存放基本数据类型和nil。如需要,要借助包装器:NSNumber/NSValue/NSNull;
(10)isKindOfClass:
与isMemberOfClass:
的异同;
(11)反射(reflect):
(12)并行与并发:
并行:
同一时刻
处理一个以上的事件,如边打电话边吃饭、边听歌边做饭等,与“串行”相对;并发:同一时间段
交替执行一个以上的任务,而并不是同一时刻处理一个以上的事件。由于多个线程调用同一事件时,cpu在多个线程之间还是·串行交替执行的,只是cpu的切换速度很快我们感觉不到。
(13)进程与线程:
进程:参与系统资源分配、系统调度的最小单位。
线程:进程中执行运算的最小单位。
父和子进程使用进程间通信机制,同一进程的线程通过读取和写入数据到进程变量来通信。
(14)SEL是什么?
SEL,一种数据类型,对方法的一种包装。包装的SEL类型数据它对应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类的实例化对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
(15)什么是Runtime,在项目中有用过么?
OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行。OC的动态性是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数,平时写的OC代码,底层都是转换成了Runtime API进行调用。
(1).利用关联对象,给分类添加属性
(2).遍历类的所有成员变量,可以访问私有成员变量,比如修改textfield的占位文字颜色、自动归档解档、字典转模型;
(3).交换方法实现,交换系统的方法;
(4).利用消息转发机制,解决方法找不到的问题;
(16)字符编码NSStringEncoding与URL编码,中文编码
GB2312编码
-+-BIG5编码
--->GBK编码
--->GB18030编码
--->Unicode编码
(17)内存五大区域及作用;
(18)ARC机制引入时机:iOS 5之后。
(19)
(20)block的类型有哪些?存储在哪些地方?MRC时代为什么要用copy特性修饰block?现在的ARC时代是怎么做的?哪些情况下block会被自动copy到堆上?__block变量为什么可以被block修改?block与当前控制器的循环引用问题(__weak与__strong);属性block能否被retain修饰(MRC和ARC)?