iOS私有属性的访问与修改

作者: _子墨 | 来源:发表于2017-04-28 16:00 被阅读370次
// Son.m

#import "Son.h"

@interface Son ()
// 将属性放在.m文件中,使之成为私有属性
@property (nonatomic, copy) NSString *name;

@end
// Father.m

#import "Father.h"
#import "Son.h"
#import <objc/runtime.h>

@implementation Father


#pragma mark - KVC 方式访问和修改私有变量

- (void)printSonNameWithKVC
{
    Son *son = [[Son alloc] init];
    
    // 修改前
    NSString *name = [son valueForKey:@"name"];
    NSLog(@"-name:%@", name);
    
    // 修改后
    [son setValue:@"Jabit" forKey:@"name"];
    NSString *nameReset = [son valueForKey:@"name"];
    NSLog(@"-nameReset:%@", nameReset);
}


#pragma mark - Runtime 方式访问和修改私有变量

- (void)printSonNameWithRuntime
{
    Son *son = [[Son alloc] init];
    
    unsigned int count = 0;
    Ivar *members = class_copyIvarList([Son class], &count);
    for (int i = 0; i < count; i++) {
        Ivar ivar = members[i];
        const char *memberName = ivar_getName(ivar);
        const char *memberType = ivar_getTypeEncoding(ivar);
        //依次打印属性名称和属性类型
        NSLog(@"%s : %s", memberName, memberType);
        
        if (strcmp(memberName, "_name") == 0) {
            // 修改前
            NSString *name = (NSString *)object_getIvar(son, members[i]);
            NSLog(@"-name:%@", name);
            
            // 修改后
            object_setIvar(son, members[i], @"Jabit");
            NSString *nameReset = (NSString *)object_getIvar(son, members[i]);
            NSLog(@"-nameReset:%@", nameReset);
            
            break;
        }
    }
}

@end

相关文章

网友评论

    本文标题:iOS私有属性的访问与修改

    本文链接:https://www.haomeiwen.com/subject/syqazttx.html