[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
修改后:李四

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言:面试笔试都是必考语法知识点。请认真复习和深入研究OC。 目录:iOS-面试题-OC基础篇 (1) - (84...
    麦穗0615阅读 4,271评论 0 33
  • KVC KVC(Key-Value-Coding)是Cocoa框架为我们提供的非常强大的工具,简译为键值编码。iO...
    Longshihua阅读 403评论 0 6
  • 今天抽空梳理了一下最近看的书,100天读书计划进行到了第十天,共读书6本,还算顺利吧。希望能坚持到底哦! ...
    元正妈妈阅读 185评论 0 0
  • 使用vue的时候 也就是v-for的时候出现了这个错误是因为:key="id" 这个id不是唯一性导致的,解决办法...
    前端Tree阅读 444评论 0 0
  • 說實話今天過得無所事事, 似乎沒有什麼故事值得去寫的.但是寫作習慣還是要繼續堅持. 講個故事提醒我自己吧.初中的時...
    青熟阅读 181评论 0 0