为什么我不应该使用 object_setIvar 来设置属性

Why should I not use object_setIvar to set properties

我有一个字典,其中包含来自 REST 端点的用户数据。这是我的用户 class

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (strong, nonatomic) NSString *uid;
@property (strong, nonatomic) NSString *email;
@property (strong, nonatomic) NSString *firstName;
@property (strong, nonatomic) NSString *lastName;
@property (assign, nonatomic) int status;

@end

我有一个方法可以设置所有属性

/*
 * set properties
 */
- (void)setPropertiesWithDictionary:(NSDictionary *)dictionary{
    for(NSString *key in dictionary){

        object_setIvar(self,
                       class_getInstanceVariable([self class], [[@"_" stringByAppendingString:key] UTF8String]),
                       dictionary[key]);
    }
}

而不是做类似的事情 [user setUid:@dictionary[@"uid"]];

我想这样调用我的方法 [user setPropertiesWithDictionary: dictionary];

只是想知道以这种方式实施 object_setIvar 是否合适。如果不是 - 如果您能解释原因,那就太好了。提前致谢。

随心所欲,既然键值编码 (KVC) 已经存在,为什么还要重新发明轮子呢?只需调用此方法:

https://developer.apple.com/documentation/objectivec/nsobject/1417515-setvaluesforkeyswithdictionary?language=objc

KVC 可以做您想要做的事情,但它比您可能做的要好得多。

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/KeyValueCoding/index.html

我认为 "int status" 可能会出现您的问题,因为字典[@ "status"] 不是 int 类型。

在你的代码实现中,user.status = dictionary[@"status"],这个结果是不可预测的。

除非你做类型判断,user.status = [dictionary[@"status"]intValue];

推荐github上的第三方框架MJExtension,满足你的需求needs.You可以看看源码