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

问题描述 投票:-1回答:2

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

#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是否很好。如果不是-如果您能解释原因,那将非常棒。提前致谢。

ios objective-c objective-c-runtime
2个回答
3
投票

您喜欢做什么,但是为什么在已经存在键值编码(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


0
投票

我认为您的问题可能与“ int status”有关,因为字典[@“ status”]的类型不是int。

在您的代码实现中,user.status = dictionary [@“ status”],此结果不可预测。

除非您做出类型判断,否则user.status = [dictionary [@“ status”] intValue];

我在github上推荐了一个名为MJExtension的第三方框架,它可以满足您的需求。您可以查看源代码。

© www.soinside.com 2019 - 2024. All rights reserved.