iOS私有属性的访问与修改

本文介绍了使用KVC(Key-Value Coding)和Runtime两种方式来访问及修改Objective-C中私有属性的具体实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 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

转载于:https://my.oschina.net/Jacedy/blog/891825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值