Runtime的使用5 【对私有变量的修改】

来源:互联网 发布:软件定制化开发 编辑:程序博客网 时间:2024/06/05 03:47

首先我们创建一个Person类。

属性name 、方法publicMethod是公共的。

属性address、方法privateMethod是私有的。


@interface Person : NSObject@property (nonatomic,copy) NSString *name;//公共的- (void)publicMethod;@end

#import "Person.h"@interface Person()@property (nonatomic,copy) NSString *address;@end@implementation Person- (instancetype)init {    self = [super init];    if (self) {        _address = @"私有属性北京";        self.name = @"孟孟";    }    return self;}//公共方法- (void)publicMethod {    NSLog(@"对外暴露的方法 %@",self.address);}//私有方法- (void)privateMethod {    NSLog(@"私有方法%@",self.name);}//重写了系统的description方法。- (NSString *)description {    return [NSString stringWithFormat:@" %@,  %@",self.address,self.name];}@end

然后我们对私有变量进行修改。比如修改私有属性address的值。

#pragma mark - 对私有变量的更改- (void)changePrivate {    Person *onePerson = [[Person alloc] init];    NSLog(@"Person属性 == %@",[onePerson description]);  //屌日的这是重写了。        unsigned  int count = 0;    Ivar *members = class_copyIvarList([Person class], &count);        for (int i = 0; i < count; i++){        Ivar var = members[i];        const char *memberAddress = ivar_getName(var);        const char *memberType = ivar_getTypeEncoding(var);        NSLog(@"获取所有属性 = %s ; type = %s",memberAddress,memberType);                    }    //对私有变量的更改    Ivar m_address = members[1];    object_setIvar(onePerson, m_address, @"上海");    NSLog(@"对私有变量的(地址)进行更改 : %@",[onePerson description]);    }


原创粉丝点击