[iOS] 修改私有属性

一.前言

由于最近十分空闲, 来写一修改私有属性的文章
1.什么是私有属性?
答: 就是写在.m延展里的属性, 这个属性在其他类中用点方法访问不到的.

二.如何修改呢

目前有两种方法

1.KVC

比如有个person类, 在.m中的延展里有个属性是name, 那么怎么访问呢

@interface Person ()
@property(nonatomic, strong) NSString *name;
@end
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Person *person = [[Person alloc] init];
    NSLog(@"修改前:%@", [person valueForKey:@"name"]);
    [person setValue:@"李四" forKey:@"name"];
    NSLog(@"修改后:%@", [person valueForKey:@"name"]);
}

打印结果如下:
修改前:(null)
修改后:李四

2.runtime

使用runtime修改私有属性也非常简单, 基本上无脑.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    Person *person = [[Person alloc] init];
    
    
    //修改前打印
    NSLog(@"修改前:%@", [person valueForKey:@"name"]);
    
    //记录属性的个数
    unsigned int count = 0;
    
    //获取属性列表
    Ivar *members = class_copyIvarList([person class], &count);

    //遍历属性列表
    for (NSInteger i = 0; i < count; i++) {
        
        //取到属性
        Ivar ivar = members[i];
        
        //获取属性名
        const char *memberName = ivar_getName(ivar);
        NSString *ivarName = [NSString stringWithFormat:@"%s", memberName];
        
        NSLog(@"属性名:%@", ivarName);
        
        //当属性名是_name的时候对其值进行修改
        if ([ivarName isEqualToString:@"_name"]) {
            object_setIvar(person, ivar, @"李四");
        }
    }
    
    //修改后打印
    NSLog(@"修改后:%@", [person valueForKey:@"name"]);
}

打印结果如下:
修改前:(null)
_name
修改后:李四

你可能感兴趣的:([iOS] 修改私有属性)