方法1:
如果你能看到类的实现以及私有成员,可以使用kvc
设置私有成员:
- (void)setValue:(nullableid)value forKey:(NSString*)key;
- (void)setValue:(nullableid)value forKeyPath:(NSString*)keyPath;
读取私有成员:
- (nullableid)valueForKey:(NSString*)key;
- (nullableid)valueForKeyPath:(NSString*)keyPath;
其中KeyPath的方式是用来访问复合对象的方式:比如person类中有一个car类的对象,car有个成员是color,
keyPath需要写成person.car.color
方法2:
假如不知类有哪些属性,我们可以利用RunTime获取所有属性,不太熟悉RunTime的同学自行脑补
获取所有属性
unsignedint numIvars =0;
Ivar* ivars =class_copyIvarList([aObjItem class], &numIvars);
然后:用循环找出你要的成员,假如第二个就是
Ivar privateIvar = ivars[1];
object_setIvar(aObjItem, privateNameIvar,@"456");
NSString*privateName = object_getIvar(aObjItem, privateNameIvar);
这样就改变第二个成员的值了
注意:
object_setIvar,object_getIvar 第一个参数是实例对象,这里不要错,会崩溃的
在改变私有成员值之前的循环里面要找到对应成员名称,ivar_getName(privateIvar)
成员属性,这个怎么获取大家自己找找吧