1. #include、#import、@class的区别?
- 在C 语言中, 我们使用
#include来引入头文件,如果需要防止重复导入需要使用#ifndef...#define...#endif - 在OC语言中, 我们使用
#import来引入头文件,可以防止重复引入头文件,可以避免出现头文件递归引入的现象。 @class仅用来告诉编译器,有这样一个类,编译代码时,不报错,不会拷贝头文件.如果需要使用该类或者内部方法需要使用#import导入
2. id 和 instancetype的区别?
id可以作为方法的返回以及参数类型 也可以用来定义变量instancetype只能作为函数或者方法的返回值- instancetype对比id的好处就是: 能精确的限制返回值的具体类型
3. id类型, nil , Nil ,NULL和NSNULL的区别?
- id类型: 是一个独特的数据类型,可以转换为任何数据类型,id类型的变量可以存放任何数据类型的对象,在内部处理上,这种类型被定义为指向对象的指针,实际上是一个指向这种对象的实例变量的指针; id 声明的对象具有运行时特性,既可以指向任意类型的对象
- nil 是一个实例对象值;如果我们要把一个对象设置为空的时候,就用nil
- Nil 是一个类对象的值,如果我们要把一个class的对象设置为空的时候,就用Nil
- NULL 指向基本数据类型的空指针(C语言的变量的指针为空)
- NSNull 是一个对象,它用在不能使用nil的场合
4. 什么情况使用 weak 关键字,相比 assign 有 什么不同?
- 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用
weak来解决, 比如:delegate代理属性, 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性一般也使用weak;当然,也可以使用strong,但是建议使用weak
weak 和 assign 的不同点
weak策略在属性所指的对象遭到摧毁时,系统会将weak修饰的属性对象的指针指 向nil,在OC给nil发消息是不会有什么问题的; 如果使用assign策略在属性所指 的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时候就产生了野指针,如果这时候在给此对象发送消息,很容造成程序奔溃assigin可以用于修饰非OC对象,而weak必须用于OC对象
5. 代理使用 weak 还是 assign
- 建议使用
weak, 对于weak: 指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。 - 可以使用
assign,也有weak的功效, 对于使用 assign 修饰delegate, 在对象释放前,需要将 delegate 指针设置为 nil,不然会产生野指针