为什么我的 NSArray 根据 NSDictonaries 的数量进行迭代

Why is my NSArray iterating according to the number of NSDictonaries

这是一个奇怪的问题,我一直在努力尝试不同的工作 arounds/bug 修复。但我已经在这方面花费了大量时间,希望眼光敏锐的人能够找出这个问题的根本原因。

基本上我将 JSON 文件序列化为 NSArray。我需要对这些数据进行一些操作,所以我创建了一个原始 NSArray 的 NSMutableArray。

然后我创建一个 NSDictonary,并比较 objectForKey 的。

但是,我注意到当我在 Xcode 控制台中通过 NSLog 语句输出时,我看到数组是按字典数迭代的。为什么要打印出 30 个数组,每个数组有 30 个字典?

这是我拥有的一些与此问题相关的代码。让我知道您的想法以及我可以做些什么来改进 this/fix。

    self.objectsList = [[NSArray alloc] init];

[[HTTPServices instance] getConnectabilityObject:^(NSArray * _Nullable dataArray, NSString * _Nullable errorMessage) {
    if (dataArray) {
        NSMutableArray *array = [[NSMutableArray alloc] init];

        for (NSDictionary *dictonary in dataArray) {
            ConnectabilityObject *object = [[ConnectabilityObject alloc] init];
            object.ConnectabilityTitle = [dictonary objectForKey:@"ConnectabilityObjectTitle"];
            object.ConnectabilityObjectType  = [dictonary objectForKey:@"ConnectabilityObjectType"];
            object.ConnectabilityFullIPAddress = [dictonary objectForKey:@"ConnectabilityObjectFullIPAddress"];
            object.ConnectabilityObjectLastOctet = [dictonary objectForKey:@"ConnectabilityObjectLastOctet"];
            object.ConnectabilityObjectPortNumberOne = [dictonary objectForKey:@"ConnectabilityObjectPortNum1"];
            object.ConnectabilityObjectPortNumberTwo = [dictonary objectForKey:@"ConnectabilityObjectPortNum2"];
            object.ConnectabilityObjectPortNumberThree = [dictonary objectForKey:@"ConnectabilityObjectPortNum3"];

            [array addObject:object];
        }
        self.objectsList = array;
    }
}];

更新

这里是关联这个数组的NSLogStatement。请注意,我是从另一种方法记录这些数据的。该方法见下文。

-(void)pingResult:(NSNumber*)success {
    NSMutableArray *objects = [NSMutableArray arrayWithArray:_objectlist];
    for (NSDictionary *objectDictonary in objects) {
        self.objectlist = nil;
        NSLog(@"Another Method NSLog %@", objects);
    }

}

这是来自控制台的 NSLog。请注意,此 "Another Method NSLog" 被调用了 30 次,这等于 JSON 文件中找到的 ConnectabilityObjects 的数量。

    2016-06-14 11:28:55.724 FlightPath[3866:1176806] Another Method NSLog (
    "<ConnectabilityObject: 0x16695d80>",
    "<ConnectabilityObject: 0x16696ad0>",
    "<ConnectabilityObject: 0x16696b90>",
    "<ConnectabilityObject: 0x16696be0>",
    "<ConnectabilityObject: 0x16696c30>",
    "<ConnectabilityObject: 0x16696ca0>",
    "<ConnectabilityObject: 0x16696cf0>",
    "<ConnectabilityObject: 0x165b14e0>",
    "<ConnectabilityObject: 0x165b1530>",
    "<ConnectabilityObject: 0x165b15c0>",
    "<ConnectabilityObject: 0x165b1610>",
    "<ConnectabilityObject: 0x165b1660>",
    "<ConnectabilityObject: 0x165b16b0>",
    "<ConnectabilityObject: 0x165b1700>",
    "<ConnectabilityObject: 0x165b1750>",
    "<ConnectabilityObject: 0x165b17a0>",
    "<ConnectabilityObject: 0x165b17f0>",
    "<ConnectabilityObject: 0x165b18b0>",
    "<ConnectabilityObject: 0x165b1900>",
    "<ConnectabilityObject: 0x16696d20>",
    "<ConnectabilityObject: 0x16696d50>",
    "<ConnectabilityObject: 0x16696da0>",
    "<ConnectabilityObject: 0x16696df0>",
    "<ConnectabilityObject: 0x16696e40>",
    "<ConnectabilityObject: 0x16696e90>",
    "<ConnectabilityObject: 0x16696ee0>",
    "<ConnectabilityObject: 0x16696f30>",
    "<ConnectabilityObject: 0x16696f80>",
    "<ConnectabilityObject: 0x16696fd0>",
    "<ConnectabilityObject: 0x166970e0>"
)
2016-06-14 11:28:55.729 FlightPath[3866:1176806] Another Method NSLog (
    "<ConnectabilityObject: 0x16695d80>",
    "<ConnectabilityObject: 0x16696ad0>",
    "<ConnectabilityObject: 0x16696b90>",
    "<ConnectabilityObject: 0x16696be0>",
    "<ConnectabilityObject: 0x16696c30>",
    "<ConnectabilityObject: 0x16696ca0>",
    "<ConnectabilityObject: 0x16696cf0>",
    "<ConnectabilityObject: 0x165b14e0>",
    "<ConnectabilityObject: 0x165b1530>",
    "<ConnectabilityObject: 0x165b15c0>",
    "<ConnectabilityObject: 0x165b1610>",
    "<ConnectabilityObject: 0x165b1660>",
    "<ConnectabilityObject: 0x165b16b0>",
    "<ConnectabilityObject: 0x165b1700>",
    "<ConnectabilityObject: 0x165b1750>",
    "<ConnectabilityObject: 0x165b17a0>",
    "<ConnectabilityObject: 0x165b17f0>",
    "<ConnectabilityObject: 0x165b18b0>",
    "<ConnectabilityObject: 0x165b1900>",
    "<ConnectabilityObject: 0x16696d20>",
    "<ConnectabilityObject: 0x16696d50>",
    "<ConnectabilityObject: 0x16696da0>",
    "<ConnectabilityObject: 0x16696df0>",
    "<ConnectabilityObject: 0x16696e40>",
    "<ConnectabilityObject: 0x16696e90>",
    "<ConnectabilityObject: 0x16696ee0>",
    "<ConnectabilityObject: 0x16696f30>",
    "<ConnectabilityObject: 0x16696f80>",
    "<ConnectabilityObject: 0x16696fd0>",
    "<ConnectabilityObject: 0x166970e0>"
)

是的。这是一个 NSLog 错误...

-(void)pingResult:(NSNumber*)success {
    for (NSDictionary *objectDictonary in _objectlist) {
        NSLog(@"%@", objectDictonary);
    }
}

在第一次尝试中,OP 代码是这样做的:

NSMutableArray *objects = [NSMutableArray arrayWithArray:_objectlist];

... 不必要地复制了实例数组 var.

OP 代码是这样做的:

self.objectlist = nil;

...这会危险地删除您要检查的实例数组。

而且,生成令人困惑的输出,OP 代码是这样做的:

NSLog(@"Another Method NSLog %@", objects);

... 表示:"for each element in my array, log my entire array".