一天几个知识点1

118 阅读3分钟

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,在 OCnil 发消息是不会有什么问题的; 如果使用 assign 策略在属性所指 的对象遭到摧毁时,属性对象指针还指向原来的对象,由于对象已经被销毁,这时候就产生了野指针,如果这时候在给此对象发送消息,很容造成程序奔溃 assigin 可以用于修饰非 OC 对象,而 weak 必须用于 OC 对象

5. 代理使用 weak 还是 assign

  • 建议使用 weak, 对于weak: 指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。
  • 可以使用 assign,也有weak的功效, 对于使用 assign 修饰delegate, 在对象释放前,需要将 delegate 指针设置为 nil,不然会产生野指针