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 * 类型的,变量名。

2.54mm单排双排排针排母直插表贴排针排座90度弯针AD封装库(ALTIUM 3D PCB封装库):Component Count : 177Component Name-----------------------------------------------HDR2.54-LI-1PHDR2.54-LI-2PHDR2.54-LI-2x2PHDR2.54-LI-2x3PHDR2.54-LI-2x4PHDR2.54-LI-2x5PHDR2.54-LI-2x6PHDR2.54-LI-2x7PHDR2.54-LI-2x8PHDR2.54-LI-2x9PHDR2.54-LI-2x10PHDR2.54-LI-2x11PHDR2.54-LI-2x12PHDR2.54-LI-2x13PHDR2.54-LI-2x14PHDR2.54-LI-2x15PHDR2.54-LI-2x16PHDR2.54-LI-2x17PHDR2.54-LI-2x18PHDR2.54-LI-2x19PHDR2.54-LI-2x20PHDR2.54-LI-3PHDR2.54-LI-4PHDR2.54-LI-5PHDR2.54-LI-6PHDR2.54-LI-7PHDR2.54-LI-8PHDR2.54-LI-9PHDR2.54-LI-10PHDR2.54-LI-11PHDR2.54-LI-12PHDR2.54-LI-13PHDR2.54-LI-14PHDR2.54-LI-15PHDR2.54-LI-16PHDR2.54-LI-17PHDR2.54-LI-18PHDR2.54-LI-19PHDR2.54-LI-20PHDR2.54-M-LI-1PHDR2.54-M-LI-2PHDR2.54-M-LI-3PHDR2.54-M-LI-4PHDR2.54-M-LI-5PHDR2.54-M-LI-6PHDR2.54-M-LI-7PHDR2.54-M-LI-8PHDR2.54-M-LI-9PHDR2.54-M-LI-10PHDR2.54-M-LI-11PHDR2.54-M-LI-12PHDR2.54-M-LI-13PHDR2.54-M-LI-14PHDR2.54-M-LI-15PHDR2.54-M-LI-16PHDR2.54-M-LI-17PHDR2.54-M-LI-18PHDR2.54-M-LI-19PHDR2.54-M-LI-20PHDR2.54-M-LS-2x2PHDR2.54-M-LS-2x3PHDR2.54-M-LS-2x4PHDR2.54-M-LS-2x5PHDR2.54-M-LS-2x6PHDR2.54-M-LS-2x7PHDR2.54-M-LS-2x8PHDR2.54-M-LS-2x9PHDR2.54-M-LS-2x10PHDR2.54-M-LS-2x11PHDR2.54-M-LS-2x12PHDR2.54-M-LS-2x13PHDR2.54-M-LS-2x14PHDR2.54-M-LS-2x15PHDR2.54-M-LS-2x16PHDR2.54-M-LS-2x17PHDR2.54-M-LS-2x18PHDR2.54-M-LS-2x19PHDR2.54-M-LS-2x20PHDR2.54-M-WS-1PHDR2.54-M-WS-2PHDR2.54-M-WS-3PHDR2.54-M-WS-4PHDR2.54-M-WS-5PHDR2.54-M-WS-6PHDR2.54-M-WS-7PHDR2.54-M-WS-8PHDR2.54-M-WS-9PHDR2.54-M-WS-10PHDR2.54-M-WS-11PHDR2.54-M-WS-12PHDR2.54-M-WS-13PHDR2.54-M-WS-14PHDR2.54-M-WS-15PHDR2.54-M-WS-16PHDR2.54-M-WS-17PHDR2.54-M-WS-18PHDR2.54-M-WS-19PHDR2.54-M-WS-20PHDR2.54-WI-1PHDR2.54-WI-2PHDR2.54-WI-2x2PHDR2.54-WI-2x3PHDR2.54-WI-2x4PHDR2.54-WI-2x5PHDR2.54-WI-2x6PHDR2.54-WI-2x7PHDR2.54-WI-2x8PHDR2.54-WI-2x9PHDR2.54-WI-2x10PHDR2.54-WI-2x11PHDR2.54-WI-2x12PHDR2.54-WI-2x13PHDR2.54-WI-2x14P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Morris_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值