通过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方法了:
- (void)setUserName:(NSString *)userName
{
[self saveObject:userName IvarName:"_userName" forKey:UserNameKey];
}
- (NSString *)userName
{
return [self getObjectWithIvarName:"_userName" forKey:UserNameKey];
}
注意这里的ivaName这个参数,是传 const char * 类型的,变量名。