【问题标题】:Why should I not use object_setIvar to set properties为什么我不应该使用 object_setIvar 来设置属性
【发布时间】:2019-10-25 03:51:54
【问题描述】:

我有一个字典,其中包含来自 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 是否可以。如果不是 - 如果您能解释原因,那就太好了。提前致谢。

【问题讨论】:

  • 为什么你认为它不会好?
  • 我还没有看到任何这样的例子。更像是变量变量的概念。基本上只是在玩弄和推动 Objective-C 的界限。

标签: ios objective-c objective-c-runtime


【解决方案1】:

做任何你想做的事,但是当键值编码 (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

【讨论】:

    【解决方案2】:

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

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

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

    我推荐github上一个叫MJExtension的第三方框架,可以满足你的需求,可以看源码。

    【讨论】:

    • API 响应是严格类型的——所以我没有那个开销。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多