你的位置:首页 > 操作系统

[操作系统]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修改:大脸猫