iOS面试题——Objective_C语言特性:分类、扩展、代理

2020-10-23  本文已影响0人  雾中探雪

一、分类

  1. 分类的作用?
    声明私有方法,分解体积大的类文件,把framework的私有方法公开
  2. 分类的特点
    运行时决议,可以为系统类添加分类 。
    说得详细些,在运行时时期,将 Category 中的实例方法列表、协议列表、属性列表添加到主类中后(所以Category中的方法在方法列表中的位置是在主类的同名方法之前的),然后会递归调用所有类的 load 方法,这一切都是在main函数之前执行的。
  3. 分类可以添加哪些内容?
    实例方法,类方法,协议,属性(添加getter和setter方法,并没有实例变量,添加实例变量需要用关联对象)
  4. 如果工程里有两个分类A和B,两个分类中有一个同名的方法,哪个方法最终生效?
    取决于分类的编译顺序,最后编译的那个分类的同名方法最终生效,而之前的都会被覆盖掉(这里并不是真正的覆盖,因为其余方法仍然存在,只是访问不到,因为在动态添加类的方法的时候是倒序遍历方法列表的,而最后编译的分类的方法会放在方法列表前面,访问的时候就会先被访问到,同理如果声明了一个和原类方法同名的方法,也会覆盖掉原类的方法)。
  5. 如果声明了两个同名的分类会怎样?
    会报错,所以第三方的分类,一般都带有命名前缀
  6. 分类能添加成员变量吗?
    不能。只能通过关联对象(objc_setAssociatedObject)来模拟实现成员变量,但其实质是关联内容,所有对象的关联内容都放在同一个全局容器哈希表中:AssociationsHashMap,由AssociationsManager统一管理。

二、扩展

  1. 一般用扩展做什么?
    声明私有属性,声明方法(没什么意义),声明私有成员变量
  2. 扩展的特点
    编译时决议,只能以声明的形式存在,多数情况下寄生在宿主类的.m中,不能为系统类添加扩展。

三、代理(Delegate)

image.png

四、通知(NSNotification)

KVO (Key-value observing)

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

六、KVC(Key-value coding)

-(id)valueForKey:(NSString *)key;
-(void)setValue:(id)value forKey:(NSString *)key;
当调用setValue:属性值 forKey:@”name“的代码时,底层的执行机制如下:
即如果没有找到Set<Key>方法的话,会按照_key,_iskey,key,iskey的顺序搜索成员并进行赋值操作。
当调用valueForKey:@”name“的代码时,KVC对key的搜索方式不同于setValue:属性值 forKey:@”name“,其搜索方式如下:
七、属性关键字
  1. 读写权限:readonly,readwrite(默认)
  2. 原子性: atomic(默认),nonatomic。atomic读写线程安全,但效率低,而且不是绝对的安全,比如如果修饰的是数组,那么对数组的读写是安全的,但如果是操作数组进行添加移除其中对象的还,就不保证安全了。
  3. 引用计数:

可变对象的copy和mutableCopy都是深拷贝
不可变对象的copy是浅拷贝,mutableCopy是深拷贝
copy方法返回的都是不可变对象

上一篇 下一篇

猜你喜欢

热点阅读