【问题标题】:How can I make NSObject that is created in runtime key value coding-compliant如何使在运行时键值编码中创建的 NSObject 兼容
【发布时间】:2018-06-12 10:39:15
【问题描述】:

首先我想指出的是,关于堆栈溢出的这个主题有很多问题,但没有任何帮助。我也尝试向这些所有者寻求建议,但无法与他们中的任何一个取得联系。

这是我的场景。我从一个对象数组的 API 接收数据。这些对象都是相同的结构,但它们会从 API 端点动态变化。当我制作了一个 NSDictionary 的 NSArray 并尝试使用提供的数组的值设置我的网格数据源时。它没有用。当我查看文档 IGGridViewDataSourceHelper 时,我发现了以下信息“截至目前,数据必须是 NSObject 的派生并且至少具有一个属性”。所以我开始思考一种在运行时创建 NSObject 的方法。我能够在 Apple Developers 文档中找到一些资源来实现这一点。

假设变量字典是在函数中给出的

请检查以下内容

- (NSArray *)getRecrodsFromDictionary: (NSDictionary*)dictionary {
    // the following include the array that I want to turn into objects
    NSArray * response = [self parseKey:@"responseDetails" fromDictionary:dictionary];
    NSMutableArray * rows = [[NSMutableArray alloc] init];
    if ([response count] != 0) {
        // 1. get all NSDictionary keys
        NSDictionary * temp = response[0];
        NSArray * keys = [temp allKeys];

        // 2. create a class
        Class ModelClass = objc_allocateClassPair([NSObject class], "WidgetDetailsModel", 0);

        // 3. all class variables with the same name as key retrieved from NSDictionary
        for (NSString * key in keys) {
            NSString * currkey = [key capitalizedString];
            const char * name = [currkey UTF8String];
            class_addIvar(ModelClass, name, sizeof(id), rint(log2(sizeof(id))), @encode(NSString));
        }

        // 4. register a class to be used
        objc_registerClassPair(ModelClass);

        for (NSDictionary * curr in response) {
            // create object
            id MC = [[ModelClass alloc] init];
            for (NSString * key in keys) {
                // set values
                const char * name = [key cStringUsingEncoding:NSASCIIStringEncoding];
                Ivar CurrVar = class_getInstanceVariable(ModelClass, name);
                NSString * newValue = [curr objectForKey: key];
                object_setIvar(MC, CurrVar, newValue);
            }
            // add object to array
            [rows addObject:MC];
        }
    }
    return [rows copy];
} 

一旦我获得返回值并尝试将其设置为数据源数据变量,我会收到以下运行时错误。

[valueForUndefinedKey:]:该类不符合键 AssetsClass 的键值编码。

我找不到任何关于如何使在运行时创建的 NSObject 键值编码兼容的信息。如何使其符合键值编码?

编辑 1: 我设法通过使字段名称大写来绕过运行时错误。 现在该表正在填充空数据(与数据的行数相同,但其中的文本为空),这是正确的事情,因为 iVar 的值没有保留。我怎样才能保留它?

编辑 2: 我仍然无法保留 iVar 值,因此我将函数的位置更改为相同的 UIView 类,然后它确实在短时间内保留了它,我不得不设置网格数据源数据值。 我很想知道是否有办法使 iVar 保留或将其属性之一设置为 strong/retain 以将其标记为释放过程。

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    在 Google、StackOverFlow 和其他 iOS 相关论坛和研究上进行了长时间搜索。这是我能够找到的结论。 Objective-c 中的 Ivar 总是弱引用。换句话说,没有办法(我能找到)使 Ivar 成为强引用。这只能通过设置每个属性的属性来实现抛出属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 2014-03-26
      • 2011-03-26
      • 2019-08-20
      • 2013-05-23
      • 2017-09-27
      相关资源
      最近更新 更多