Runtime-分类,修改私有属性,KVC

本文介绍了iOS开发中利用Runtime进行字体适配、创建引导层和修改私有属性的方法。通过类别Category实现字体适配,使用method_exchangeImplementations交换方法;制作引导层时,借助objc_setAssociatedObject与objc_getAssociatedObject动态添加属性;并展示了如何通过KVC和Runtime来修改私有属性值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 1、字体适配思路

写个UIFont(category),在category里面重写+(void)load方法,采用method_exchangeImplementations 进行方法替换,具体代码如下操作:

///自定义字体,缩放等相关适配信息
+ (UIFont *)custom_systemFontOfSize:(CGFloat)fontSize{
    //获取设备屏幕宽度,并计算出比例scale
    CGFloat width = [[UIScreen mainScreen] bounds].size.width;
    CGFloat scale  = width/375.0;
    //注意:系统的方法名已变成了自定义的方法名
    return [UIFont custom_systemFontOfSize:fontSize * scale];
}

//重写
+ (void)load{
    //获取系统方法
    Method sytemMethod = class_getClassMethod([UIFont class], @selector(systemFontOfSize:));
    //获取自定义方法
    Method customMethod = class_getClassMethod([UIFont class], @selector(custom_systemFontOfSize:));
    //交换
    method_exchangeImplementations(sytemMethod, customMethod);
}

2、制作比较细腻的引导层,一般引导层,直接在window上加个UIView搞就完事了,做好适配就行

新增category,通过objc_setAssociatedObject,objc_getAssociatedObject来动态添加UIView引导属性,这样可以把业务逻辑分离的比较清晰一些,需要提前设计好引导层,否则坐标位置处理麻烦

3、修改私有属性

首先定义一个测试类

///.h文件
@interface ModifyPrivateProperty : NSObject

@end
///.m文件
#import "ModifyPrivateProperty.h"

@implementation ModifyPrivateProperty
{
    //私有属性
    NSString *name;
}
@end

3.1 通过KVC修改私有属性值

 ModifyPrivateProperty *target = [ModifyPrivateProperty new];
 [target setValue:@"123" forKey:@"name"];
 NSLog(@"target private name value:%@",[target valueForKey:@"name"]);

打印结果如下:

OCTest[7557:961519] target private name value:123

3.2通过Runtime修改私有属性

ModifyPrivateProperty *target = [ModifyPrivateProperty new];
unsigned int count;
Ivar *props = class_copyIvarList([target class], &count);
for (int i =0; i<count; i++) {
   Ivar prop = props[i];
   const char * key = ivar_getName(prop);
   if (strcmp(key, "name") == 0) {
       object_setIvar(target, prop, @"123");
   }
}
NSLog(@"target private name value:%@",[target valueForKey:@"name"]);

打印结果如下:

OCTest[7666:983222] target private name value:123

更多精彩内容请关注公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值