【问题标题】:Set property values of an Objective-C class using reflection使用反射设置 Objective-C 类的属性值
【发布时间】:2014-08-28 00:15:56
【问题描述】:

我正在尝试学习 Objective-C 中的反射。我找到了一些关于如何转储类的属性列表的重要信息,尤其是here,但我想知道是否可以使用反射设置属性的值。

我有一个键(属性名)和值的字典(全部为NSStrings)。我想使用 Reflection 来获取属性,然后将其值设置为我的字典中的值。这可能吗?还是我在做梦?

这与字典无关。我只是使用字典来发送值。

类似于 this question,但针对 Objective C。

- (void)populateProperty:(NSString *)value
{
    Class clazz = [self class];
    u_int count;

    objc_property_t* properties = class_copyPropertyList(clazz, &count);
    for (int i = 0; i < count ; i++)
    {
        const char* propertyName = property_getName(properties[i]);
        NSString *prop = [NSString  stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
        // Here I have found my prop
        // How do I populate it with value passed in?
    }
    free(properties);

}

【问题讨论】:

    标签: objective-c reflection


    【解决方案1】:

    Objective C 属性自动符合NSKeyValueCoding 协议。您可以使用setValue:forKey: 通过字符串属性名称设置任何属性值。

    NSDictionary * objectProperties = @{@"propertyName" : @"A value for property name",
                                        @"anotherPropertyName" : @"MOAR VALUE"};
    
    //Assuming class has properties propertyName and anotherPropertyName
    NSObject * object = [[NSObject alloc] init];
    
    for (NSString * propertyName in objectProperties.allKeys)
    {
        NSString * propertyValue = [objectProperties valueForKey:propertyName];
    
        [object setValue:propertyValue
                  forKey:propertyName];
    }
    

    【讨论】:

    • 这是反射。使用此方法时会调用属性 mutator 和 accessor。
    • @Lucy setValue:forKey:NSKeyValueCoding 协议的一部分,NSObject 符合该协议。它与字典无关;你在想setObject:forKey:,这是NSMutableDictionary上的一个方法。
    • @Lucy setValue:forKey: 跳过一堆圈,找到二传手并调用它。它是反射。而且一般是要避免的。
    【解决方案2】:

    NSObject 实现的NSKeyValueCoding 协议(参见 NSKeyValueCoding.h)包含方法 -setValuesForKeysWithDictionary:。此方法完全采用您描述的字典类型并设置接收者的适当属性(或 ivars)。

    这绝对是反思; setValuesForKeysWithDictionary: 中的代码通过您给它的名称访问属性,如果不存在 setter 方法,甚至会找到适当的 ivar。

    【讨论】:

    • 这是反射;仅仅因为您没有编写反射代码并不意味着它不是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多