ios 获取与修改类私有属性与实例变量


 1 #import "Cat.h"
 2 
 3 @interface Cat ()
 4 
 5 @property (nonatomic, copy) NSString *name;
 6 
 7 @end
 8 
 9 @implementation Cat{
10     int age;
11 }
12 
13 -(instancetype)initWithName:(NSString *)string{
14     self = [super init];
15     if (self) {
16         _name = string;
17         age = 1;
18     }
19     return self;
20 }
21 
22 @end
Cat
        Cat *cat = [[Cat alloc]initWithName:@"大懒猫"];
        
        NSLog(@"第一种,通过kvc获取与修改属性以及实例变量age\n\n");

        //第一种,通过kvc获取与修改属性以及实例变量age
        NSString *cat_name = [cat valueForKey:@"name"];
        [cat setValue:@"大花猫" forKey:@"name"];
        NSString *cat_name_modified = [cat valueForKey:@"_name"];//key值为name与_name都可以,因为程序运行时会去类中找,先找同名的,再找带有下划线_的,找不到就报错。
        NSLog(@"name修改前:%@, 修改后:%@",cat_name,cat_name_modified);
        //打印结果:name修改前:大懒猫, 修改后:大花猫
        
        int age = [[cat valueForKey:@"age"]intValue];
        [cat setValue:@2 forKey:@"age"];
        int age_mod = [[cat valueForKey:@"age"]intValue];
        NSLog(@"age修改前:%d, 修改后:%d",age,age_mod);
        //打印结果:age修改前:1, 修改后:2
        
        NSLog(@"\n\n第二种,通过runtime获取与修改属性\n\n");
        
        //第二种,通过runtime获取与修改属性
        Ivar m_name = class_getInstanceVariable([Cat class], "_name");

        cat_name = (NSString *)object_getIvar(cat, m_name);
        NSLog(@"name修改前:%@",cat_name);
        //打印结果:name修改前:大花猫
        
        object_setIvar(cat, m_name, @"大脸猫");
        cat_name = (NSString *)object_getIvar(cat, m_name);
        NSLog(@"name修改:%@",cat_name);
        //打印结果:name修改:大脸猫

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM