runtime属性的读与写

通过ivar读、写

这里以Person类为例,来看怎么对属性值进行操作。

Person类有一个属性name

@property (nonatomic, copy) NSString *name;

对应的变量名_name

@synthesize name = _name;

p是实例化的一个对象。需要引入runtime头文件<objc/runtime.h>

  • 通过变量名获取属性值
// get the ivar by variable name
Ivar ivar = class_getInstanceVariable([Person class], "_name");
// read the variable's value
NSString *value = object_getIvar(p, ivar);
  • 给属性赋值
// get the ivar by variable name
Ivar ivar = class_getInstanceVariable([Person class], "_name");
// set the ivar
object_setIvar(p, ivar, value);

举例

这里还是以Person为例,有这么一个需求:用户的登录信息,保存到本地,项目中其他地方可能需要用这些信息。

  • 存储方法
- (void)saveObject:(nullable id)value
    IvarName:(const char *)name forKey:(NSString *)key {
    // get the ivar by variable name
    Ivar ivar = class_getInstanceVariable([Person class], name);
    // set the ivar
    object_setIvar(p, ivar, value);
    // save the ivar
    [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

这里入参数是 属性值、变量名、存储的key。

操作步骤是 先取到变量对应的Ivar,然后通过object_setIvar()函数给变量赋值,之后写本地缓存。

  • 读取方法
- (NSString *)getObjectWithIvarName:(const char *)name
                             forKey:(NSString *)key
{
    // get the ivar by variable name
    Ivar ivar = class_getInstanceVariable([Person class], name);
    // read the variable's value
    NSString *value = object_getIvar(p, ivar);
    // if value is nil, read from local files.
    value = value ? value : [[NSUserDefaults standardUserDefaults] objectForKey:key];
    // return value
    return value;
}

这里入参数是 变量名、存储变量时用的key。

操作步骤是 先取到变量对应的Ivar,然后通过object_getIvar()函数来读变量的值,如果变量已被赋值,则直接返回,如果变量未被赋值,从缓存中读,缓存中也没有,返回nil。

  • set/get

变量的读、写方法已经完成,下面就是看变量set、get方法了:

- (void)setUserName:(NSString *)userName
{
    [self saveObject:userName IvarName:"_userName" forKey:UserNameKey];
}
- (NSString *)userName
{
    return [self getObjectWithIvarName:"_userName" forKey:UserNameKey];
}

注意这里的ivaName这个参数,是传 const char * 类型的,变量名。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值