OC语言特性

一、分类

1.1做了那些事?(关键词:明私、分解、私公开化)

声明私有方法,分类头文件放到宿主文件.m中,不对外暴露

分解体积庞大的类文件 功能复杂的按功能分类

framework私有方法公开化

1.2特点 (关键词:运决议 系统类加)

运行时决议 分类定义好后不立即加到宿主类,而是runtime将分类中内容加到对应宿主类(分类与扩展最大区别)

能为系统类添加分类 如坐标获取,UI文件

1.3可添加的内容?(关键字:实 类 协 属非实变)

实例方法 类方法 协议 属性非实例变量 通过关联对象添加实例变量

1.4加载调用栈 objc_init ->map_I_images镜像->map_images_nolock->read images->remethodizeclass

1.5分类实现原理/实例方法添加逻辑(关键字:先访后编 覆盖原类 同名编译报错)

最先访最后编译类 同名类法谁生效取决编译顺序 后面的会覆盖前面

分类加方法“覆盖”原类,实际宿主类同名方法仍存在

名字相同引起编译报错

二、关联对象

2.1三个方法

id objc_getAssociatedObject(id object,const void *key) 根据指定key到object对象 获取关联值 返回给调用方

id objc_setAssociatedObject(id object,const void *key,id value, objc_AssociationPolicy policy) key和value建立映射关系,关系通过policy关联到object对象 关联策略作用:声明或告知该value是copy、assign还是retain形式关联到数组对象

id objc_removeAssociatedObject(id object) 据指定对象移除所有关联对象

2.2本质

由AssociationsManager管理,AssociationsHashMap存储,所有对象的关联内容都在一个全局容器中

objc_Association objc_AssociationMap AssociationsHashMap

三、扩展

3.1能做什么事?声属方员

声明私有属性、方法、成员变量

3.2特点 编决议 声宿 不系统

编译时决议 只声明形式存在 多寄生于宿主类 不能为系统类加扩展

四、代理

4.1特点 protocol 一对一 weak

以protocol形式体现,用代理模式实现 一对一 weak规避循环引用

五、通知 (关键词:观察 跨层 一对多 通知中心)

5.1特点:用观察者模式实现的 用于跨层传递消息的机制

一对多 发送者经由通知中心广播给多个观察者

5.2如何实现通知机制

在通知中心,系统会维护一个字典,value是数组列表,列表中每一个成员首先应该包含通知接收的观察者,还包含观察者调用的方法。

六、KVO

6.1概念:(关键词:观察者模式 isa-swizzling)Key-value observing 的缩写,观察者模式的又一实现,Apple用isa混写(isa-swizzling)实现KVO

6.2实现原理:(关键词:addObserver: forKeyPath: 运动建NSKVONotifying_A)

在setValue前后分别调用willChangeValueForKey和didChanageValueForKey

注册观察者,实际是调用系统的addObserver: forKeyPath:方法,观察者观察A的某一成员变量或属性,系统会在运行时动态创建NSKVONotifying_A,此时会将原来的A的isa指针指向NSKVONotifying_A(继承自原来的A),这也是isa混写技术在KVO的体现,NSKVONotifying_A重写setter方法负责通知所有观察者对象。

七、KVC

7.1概念:键值编码技术 调用某个实例的valueForKey:方法来获取和同名或相似名称实例变量的值,setValue: forKey:设置某一对象中与key同名或相似名称的实例变量的值。

            

7.2是否破坏面向对象编程思想?

类或实例内部某一私有成员变量名称的情况下,在外界可以通过已知的key对私有成员变量进行访问或设置操作

7.3访问器方法是否存在的判断逻辑?getKey Key isKey

成员变量 _key _isKey key isKey

八、属性关键字

读写权限readwrite readonly 原子性atomic nonatomic 引用计数retain/strong assign/unsafe_unretained weak copy

8.1 atomic (赋获线安全 不作访)保证赋值和获取线程安全,不代表操作和访问。如数组增删对象不在赋值范围内,不保证线程安全

8.2 assign(基数型 但对象型不改引计 悬垂指针致泄漏)

可以修饰基本数据类型,也可以修饰对象类型。

但修饰对象类型的时候,不改变引用计数。

被释放后继续指向原地址,由于悬垂指针导致内存泄漏或者异常

8.3 copy (浅 拷地址 增引计 指同空间 深 同内容不同地址 新空间 不增引计)

浅拷贝 拷贝内存地址,增加引用计数,指向同一块内存空间

深拷贝 开辟新的内存空间,不增加引用计数,内容相同的不同内存地址

mutablecopy可变深拷贝 copy不可变 不可变深 可变浅

无论对象可变还是不可变,mutablecopy后都是可变对象 深拷贝

copy后都是不可变对象 不可变对象深拷贝 可变对象浅拷贝

8.4 retain unsafe unretained MRC strong ARC

MRC如何重写retain修饰变量的setter方法?传进来的不是原来的对象(若传进来对象恰好是原来的对象,被release,再通过obj指针访问被释放废弃的对象就会导致程序异常,crash),对新对象进行release操作,对新传进来的对象进行retain操作,同时赋值给成员变量

8.5 weak (不改 释放置nil)不改引计 对象被释放自动置nil

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值