当前位置:   article > 正文

iOS Runtime理解和应用场景

ios runtime

一、Runtime的动态性

OC的运行时系统(Runtime System)提供了丰富的动态特性,包括类与对象的创建、消息发送与转发、方法的动态添加与替换、属性的动态合成等。通过使用运行时库提供的API,可以在运行时获取和操作类与对象的信息,实现各种动态性的功能。

 我对 Runtime 的理解是,它是 Objective-C 语言的核心之一,为我们提供了一种在程序运行时动态操作类和对象的能力。通过 Runtime,我们可以在不修改源代码的情况下,实现诸如动态创建类、添加成员变量、调用方法、交换方法实现等功能,从而实现更灵活、更动态的编程方式。

二、应用场景

1、实现Runtime在分类创建属性(添加关联对象)

当使用 Objective-C 的分类来添加属性时,通常情况下是无法直接在分类中声明实例变量的,因为分类不允许添加实例变量。但是,我们可以利用 Runtime 来实现在分类中添加属性的功能,具体步骤如下:

  1. 定义关联的键值:为了关联属性和其对应的存取方法,需要定义一个全局唯一的键值。

  2. 实现属性的 getter 和 setter 方法:在分类中实现属性的 getter 和 setter 方法,这些方法将通过 Runtime 添加到分类中。

  3. 使用 Runtime 添加属性:在分类的实现文件中,通过 Runtime 的函数来动态地为类添加属性。

下面是一个示例代码,演示了如何使用 Runtime 在分类中添加属性:

  1. #import <objc/runtime.h>
  2. // 定义关联的键值
  3. static char kAssociatedObjectKey;
  4. @interface NSObject (MyCategory)
  5. // 声明属性
  6. @property (nonatomic, strong) NSString *myProperty;
  7. @end
  8. @implementation NSObject (MyCategory)
  9. // 实现属性的 getter 方法
  10. - (NSString *)myProperty {
  11. // 使用关联对象获取属性值
  12. return objc_getAssociatedObject(self, &kAssociatedObjectKey);
  13. }
  14. // 实现属性的 setter 方法
  15. - (void)setMyProperty:(NSString *)myProperty {
  16. // 使用关联对象设置属性值
  17. objc_setAssociatedObject(self, &kAssociatedObjectKey, myProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  18. }
  19. @end

2--黑魔法:交换方法用于统一处理某个方法

管理类方法.h

  1. #import <Foundation/Foundation.h>
  2. @interface AARunTimeUtility : NSObject
  3. /**
  4. 交换实例方法
  5. @param cls 当前class
  6. @param originalSelector originalSelector description
  7. @param swizzledSelector swizzledSelector description
  8. @return 返回
  9. */
  10. + (BOOL)swizzlingInstanceMethodInClass:(Class)cls originalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector;
  11. /**
  12. 交换类方法
  13. @param cls 当前class
  14. @param originalSelector originalSelector description
  15. @param swizzledSelector swizzledSelector description
  16. @return 成
  17. */
  18. + (BOOL)swizzlingClassMethodInClass:(Class)cls originalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector;
  19. @end

.m文件

  1. #import "AARunTimeUtility.h"
  2. #import <objc/runtime.h>
  3. @implementation AARunTimeUtility
  4. + (BOOL)swizzlingInstanceMethodInClass:(Class)cls originalSelector:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector
  5. {
  6. Class class = cls;
  7. Method originalMethod = class_getInstanceMethod(class, originalSelector);
  8. Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
  9. BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
  10. if (didAddMethod)
  11. {
  12. class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
  13. }
  14. else
  15. {
  16. method_exchangeImplementations(originalMethod, swizzledMethod);
  17. }
  18. return didAddMethod;
  19. }
  20. + (BOOL)swizzlingClassMethodInClass:(Class)cls originalSelector:(SEL)origi
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/428245
推荐阅读
相关标签
  

闽ICP备14008679号