iOS 进阶文集

Objective-C相关常见问题

2018-08-06  本文已影响1人  繁华落尽丶lee

一、分类

分类都做了什么?

分类的特点

分类可以添加哪些内容

多个分类中有同名方法,哪个方法会生效?

最后编译的分类中的方法会生效。倒序遍历,所以最先添加的那个生效。

分类中的方法会“覆盖”宿主类的方法的原因

因为分类中的方法会插入到宿主方法列表数组的前边,先查找到返回。

分类的机制或者原理

能否为分类添加实例变量

可以通过关联对象实现

消化这篇文章Category不再是问题 深入理解Objective-C:Category -- 美团技术团队

二、关联对象

什么是关联对象

id objc_getAssociatedObject(id object, const void * key) // 通过key在Object获取关联的
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
void objc_removeAssoicatedObjects(id object)

成员变量被添加到哪里了?

关联对象有AssociationsManager管理并在AssociationHashMap存储,
所有对象的关联内容都在同一个全局容器中。

AssociationsHashMap --> ObjectAssociationMap --> ObjectAssociation

关联对象的本质.png

参考文章关联对象 AssociatedObject 完全解析

三、扩展

做什么?

与分类的区别

四、代理

什么代理

工作流程

代理流程.png

问题

五、通知

特点

实现机制和原理是怎样的

发送者 ---> 通知中心 ---> 多个接收者

怎样实现通知机制?

Notification_Map ---> NotificationObject

六、KVO

什么是KVO?

实现机制

KVO实现原理.png

系统在运行时,动态创建了一个子类NSKVONotifying_A类,重写Setter方法。

重写的Setter添加的方法

// NSKVONotifying_A 的Setter实现
- (void)setValue:(id)obj {
    [self willChangeValueForKey: @"keyPath"];
    // 调用父类实现,也即原类的实现
    [super setValue:obj];
    [self didChangeValueForKey: @"keyPath"];
}

KVC会触发KVO吗?

会,setValue:forKey:会调用,KVO重写的Setter方法。

通过成员变量直接赋值是否能触发KVO?

不会,需要调用willChangeValueForKey:didChangeValueForKey:,这是手动KVO的实现。

总结

七、KVC

什么是KVC?

KVC是Key Value coding的缩写,键值编码技术。

八、属性关键字

属性关键字的分类

读写权限

原子性

引用计数

assign和weak的区别

assign

weak

copy

@propery (copy) NSMutableArray *array; 

问题:

浅拷贝和深拷贝

区别?

copy关键字使用

总结

上一篇 下一篇

猜你喜欢

热点阅读