iOS-面试 OC语言特性

分类

  1. 分类的作用
    声明私有方法,将大体积的类分开,可以将framework中的私有方法公开
  2. 分类的特点
    是在运行时,才将Category中的实例方法列表、协议列表、属性列表添加到主类上(所以Category中的方法都是在主类的同名方法之前的),然后才提柜调用所有类的load方法,这些方法都是在main函数之前执行的。
  3. 分类可以添加哪些内容
    实例方法、类方法、协议、属性(通过添加setter和getter方法,并没有添加实例变量)
  4. 如果有两个分类A和B,分类中有一个同名方法,哪个方法最终会生效?
    取决于分类的编译顺序,后编译的那个分类的同名方法生效,而之前的会被覆盖(并不是真正的覆盖,因为其与的方法仍然存在只是访问不到,因为在添加类方法是倒序遍历方法列表的,因因此最后编译的分类的方法会在方法列表前面,访问时就会先被访问到。因此,如果生命一个和原类方法同名的方法,也会覆盖原类方法)
  5. 添加了两个同名的分类 会报错的
  6. 分类能添加成员变量吗?
    分类是不能添加成员变量。只能通过运行时中的关联对象来模拟实现成员变量,实际~~~~是关联内容,所有对象的关联内容都放在同一个全局容器哈希表中:AssociationsHashMap,由于AssociationsManager统一管理

扩展

  1. 扩展的作用
    声明私有属性、声明方法、声明私有成员变量
  2. 扩展的特点
    编译时决议,只能以声明的形式存在,我们不能为系统类添加扩展

代理

传递方式是一对多的

通知

使用观察者模式来实现跨层传递信息,传递方式是一对多的

KVO

是另外一种观察者模式

当被观察额peoperty值发生变化时,或者它以来的某个key发生变化时 就会触发observeValueForKeyPath:ofObject:change:context:方法

可以用一下几种方式触发被改变property值:

  1. 使用key-value 的 accessor方法
  2. 使用 kvc方法 例如 setValue:forKey:、insertValue:inPropertyWithKey:
  3. 使用mutableArrayValueForKey:取得一份代理对象,并操作这个代理对象

我们也可以手动发送change notification

- (void)setValue:(id)value
{
    [self willChangeValueForKey:@"key"];
    
    [super setValue:value];
    
    [self didChangeValueForKey:@"key"];
}

KVC