2

我是 Objective-C 的新手,我的任务是比较同一应用程序的 2 个构建,以了解它们的 Info.plist 和 Defaults.plist 的差异。

我已经能够弄清楚从应用程序包中读取 PLists 的步骤,但是很难弄清楚如何将 PLists 中的每个键与其对应文件进行比较。为了说明我是否需要比较 2 个应用程序包(比如说 build_100 和 build_101)之间的 Info.plist,我如何递归地转到 build_100 中的每个键并比较 build_101 中的相同键以验证它们是否相同。

如果两个 PList 相同,这很容易,因为isEqualToDictionary将返回 TRUE,但如果嵌套字典中的某些内容在两个构建之间不同,则会出现问题。

通过此处的相关查询,我很清楚答案是我编写了一个遍历两个 PList 的递归方法,但我有一个真正令人沮丧的时间来找出一种方法来为嵌套字典(如Info.plist.

4

2 回答 2

1

所以我终于弄清楚了这件事,所以想与其他人分享以供将来参考。我敢肯定,将来会有其他迷失的灵魂在寻找类似的东西(或者至少我希望:))。

我编写代码的方式是:

  1. 阅读 NSDictionaries 中的两个 Plist
  2. 将一个 Plist 视为“待测试”,将另一个 Plist 视为参考(用于比较)以确定其是否通过/失败
  3. 遍历“待测试”Plist 中的所有键,并比较“参考”Plist 中的每一个键
  4. 在比较数组或字典时,此检查(这是我一直在努力的部分)必须是递归检查

为步骤 #1、2、3 编写的代码很简单,所以我将给出我为 #4 编写的方法,这是我最初问题的症结所在。

此函数 compareSourceObject() 将采用 3 个参数:

  • sourceObject:要测试的对象
  • targetObject: 比较对象
  • trailPath:字符串,它将保存失败的密钥的整个路径
- (void)compareSourceObject:(id)sourceObject andTargetObject:(id)targetObject with BreadcrumbTrail:(NSString *)trailPath{
    NSString *message = [[NSString alloc] init];

    if ([sourceObject isKindOfClass:[NSDictionary 类]]){
        for(sourceObject 中的 id 项){
            [self compareSourceObject:[sourceObject objectForKey:item] andTargetObject:[targetObject objectForKey:item] withBreadcrumbTrail:[trailPath stringByAppendingFormat:@"->%@", item]];
        }
    }
    else if ([sourceObject isKindOfClass:[NSArray class]]){
        for (int counter=0; counter %d", counter]];
        }
    }
    否则 if(![sourceObject isEqual:targetObject]){
        NSLog(@"值不匹配。\"TestedDicationary\" 中的值是 (%@) 但引用字典有 (%@)", targetObject, sourceObject);
    }
}

希望这可以帮助。非常欢迎评论/建议/优化。

于 2012-11-15T11:10:12.273 回答
0

取一个 plist,并将属性解释为一组 ( NSSet) 字符串值,例如

:items:0:assets array

:items:0:assets:0:kind string VALUE

注意我使用/usr/libexec/PlistBuddy格式来描述一个属性 - path type [value].

然后对第二个 plist 执行相同的操作,并使用NSSet函数比较集合。

于 2012-10-26T09:21:08.057 回答