ios - runtime中property的赋值问题

 朱骆篪 发布于 2022-10-29 16:17
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
3 个回答
  • 都是大神啊,求教这些语法我从来没学过,我常见的是什么Objective-C 最常用的那种语法。
    请问这些语法是属于什么知识呢?在什么地方常用呢?多谢大大解答啊~ 我要掌握这些看着很酷的语法~~~~

    2022-11-12 01:46 回答
  • 按照你添加的方法, 这个也是可以的

        SEL setter = NSSelectorFromString(@"setPro:");
        SEL getter = NSSelectorFromString(@"pro");
        if ([p1 respondsToSelector:setter] && [p1 respondsToSelector:getter]) {
            [p1 performSelector:setter withObject:@"NBA"];
            id d = [p1  performSelector:getter withObject:nil];
            NSLog(@"d,%@",d);
        }
    2022-11-12 01:46 回答
  • - (void)dynamic2{
        
        unsigned int count;
        
        //在运行时创建继承自NSObject的People类
        Class People = objc_allocateClassPair([NSObject class], "People", 0);
        
        NSString *proName = @"pro";
        
        class_adpar(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);
    
    2022-11-12 01:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有