前言
#import <objc/runtime.h>
- 查询方法
- 给分类添加属性
- Method Swizzling
- 动态添加方法
- 字典转属性
0、利用运行时API 进行属性的获取和修改
- 利用运行时API 进行获取、修改、操作保护的属性
objc_getClass
、objc_msgSend
的配合使用
id WCRedEnvelopesLogicMgr = [objc_getClass("WCRedEnvelopesLogicMgr") new];
objc_msgSend(WCRedEnvelopesLogicMgr, @selector(doSendHongBaoTask));
1、查询类信息
1、1 获取类的名称
- 方法:
const char *object_getClassName(id obj)
1、2 获取类中的方法
- 方法:
Method *class_copyMethodList(Class cls, unsigned int *outCount)
2、给分类添加属性
2、1 给分类添加属性
CMessageMgr+knkeyword.h
CMessageMgr+knkeyword.m
3、Method Swizzling
3、1 Method Swizzling
- 结合@dynamic的 associatedObject例子
4、ynamic Method Resolution
借助 setAssociatedObject
和 getAssociatedObject
这两个函数,向既有的类当中添加存储属性。
4、1 动态添加方法(Dynamic Method Resolution)
4.2 知识补充
5、字典转模型
MJExtension
是我以前经常用的
6、XCTest 的最简单版本:借助 Objective-C 的运行时机制实现
- XCTest 的最简单版本:借助 Objective-C 的运行时机制实现
7、运行时层面的上一层框架:Foundation
- KVC 和 KVO 允许我们将 UI 和数据进行绑定。这也是 Rx 以及其他响应式框架实现的基础。
8、Swift 的动态性
- @objc 和 @dynamic
1) @objc 将您的 Swift API 暴露给 Objective-C 运行时,但是它仍然不能保证编译器会尝试对其进行优化。 2) 想使用动态功能的话,就需要使用 @dynamic。(一旦您使用了 @dynamic 修饰符之后,就不需要添加 @objc 了,因为它已经隐含在其中。)
8.1 Swift 当中的动态特性
- 方法转发
// 1 override class func resolveInstanceMethod(_ sel: Selector!) -> Bool { // 添加实例方法并返回 true 的一次机会,它随后会再次尝试发送消息 } // 2 override func forwardingTarget(for aSelector: Selector!) -> Any? { // 返回可以处理 Selector 的对象 } // 3 - Swift 不支持 NSInvocation
- 方法混淆
方法混淆 1) load 在 Swift 不再会被调用,因此我们需要在 initialize 中进行混淆。 2) 在 Objective-C 当中,我们使用 dispatch_once,但是自 Swift 3 之后,dispatch_once 便不复存在于 Swift 当中了。事情变得略为复杂。
- 内省
if self is MyClass { // YAY } let myString = "myString"; let mirror = Mirror(reflecting: myString) print(mirror.subjectType) // “String" let string = String(reflecting: type(of: myString)) // Swift.String
is
替代了isMemberOfClass
see also
转载请注明:张坤楠的博客 > Objective-C_Runtime_Cases