ios - runtime中property的赋值问题
本文介绍了ios - runtime中property的赋值问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
unsigned int count;
//在运行时创建继承自NSObject的People类
Class People = objc_allocateClassPair([NSObject class], "People", 0);
//完成People类的创建
objc_registerClassPair(People);
objc_property_attribute_t type = {"T", "@\"NSString\""};
objc_property_attribute_t attribute2 = {"N",""};//value无意义时通常设置为空
objc_property_attribute_t ownership = { "C", "" };
objc_property_attribute_t backingivar = { "V", "_pro"};
objc_property_attribute_t attrs[] = {type,attribute2, ownership, backingivar};
//向People类中添加名为pro的属性,属性的4个特性包含在attributes中
BOOL y = class_addProperty(People, "pro", attrs, 4);
NSLog(@"%d",y);
//创建People对象p1
id p1 = [[People alloc]init];
objc_property_t * properties = class_copyPropertyList(People, &count);
for (int i = 0; i<count; i++) {
NSLog(@"属性的名称为 : %s",property_getName(properties[i]));
NSLog(@"属性的特性字符串为: %s",property_getAttributes(properties[i]));
}
//请问怎么为pro赋值?
解决方案
- (void)dynamic2{
unsigned int count;
//在运行时创建继承自NSObject的People类
Class People = objc_allocateClassPair([NSObject class], "People", 0);
NSString *proName = @"pro";
class_addIvar(People, [proName cStringUsingEncoding:NSUTF8StringEncoding], sizeof(NSString *), log2(sizeof(NSString*)), @encode(NSString*));
//完成People类的创建
objc_registerClassPair(People);
objc_property_attribute_t type = {"T", "@\"NSString\""};
objc_property_attribute_t attribute2 = {"N",""};//value无意义时通常设置为空
objc_property_attribute_t ownership = { "C", "" };
objc_property_attribute_t backingivar = { "V", [proName cStringUsingEncoding:NSUTF8StringEncoding]};
objc_property_attribute_t attrs[] = {type,attribute2, ownership, backingivar};
//向People类中添加名为pro的属性,属性的4个特性包含在attributes中
if (class_addProperty(People, [proName cStringUsingEncoding:NSUTF8StringEncoding], attrs, 4)) {
NSString *s = [NSString stringWithFormat:@"set%@:",[proName capitalizedString]];
//添加get和set方法
class_addMethod([People class], NSSelectorFromString(proName), (IMP)getter, "@@:");
class_addMethod([People class], NSSelectorFromString(s), (IMP)setter, "v@:@");
}
//创建People对象p1
id p1 = [[People alloc]init];
objc_property_t * properties = class_copyPropertyList(People, &count);
for (int i = 0; i<count; i++) {
NSLog(@"属性的名称为 : %s",property_getName(properties[i]));
NSLog(@"属性的特性字符串为: %s",property_getAttributes(properties[i]));
}
[p1 setValue:@"111" forKey:@"pro"];
NSLog(@"%@", [p1 valueForKey:@"pro"]);
}
id getter(id self1, SEL _cmd1) {
NSString *key = NSStringFromSelector(_cmd1);
Ivar ivar = class_getInstanceVariable([self1 class], [key cStringUsingEncoding:NSUTF8StringEncoding]);
NSString *s = object_getIvar(self1, ivar);
return s;
}
void setter(id self1, SEL _cmd1, id newValue) {
//移除set
NSString *key = [NSStringFromSelector(_cmd1) stringByReplacingCharactersInRange:NSMakeRange(0, 3) withString:@""];
//首字母小写
NSString *head = [key substringWithRange:NSMakeRange(0, 1)];
head = [head lowercaseString];
key = [key stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:head];
//移除后缀 ":"
key = [key stringByReplacingCharactersInRange:NSMakeRange(key.length - 1, 1) withString:@""];
Ivar ivar = class_getInstanceVariable([self1 class], [key cStringUsingEncoding:NSUTF8StringEncoding]);
object_setIvar(self1, ivar, newValue);
这篇关于ios - runtime中property的赋值问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文