iOS私有属性的访问与修改
博客专区 > _子墨 的博客 > 博客详情
iOS私有属性的访问与修改
_子墨 发表于9个月前
iOS私有属性的访问与修改
  • 发表于 9个月前
  • 阅读 14
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

// 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
共有 人打赏支持
粉丝 47
博文 157
码字总数 140970
×
_子墨
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: