Search code examples
iosobjective-cnsarraynsdictionary

Why is my NSArray iterating according to the number of NSDictonaries


This is an odd issue, and I've been working on trying different work arounds/bug fixing. But I've spent a considerable amount of time on this and hope someone with some fresh eyes can potentially spot the root cause of this issue.

Basically I am serializing a JSON file as an NSArray. I need to do some manipulation with this data, so I create an NSMutableArray of that original NSArray.

I then create a NSDictonary, and compare objectForKey's.

However, I noticed when I output through an NSLog statement in the Xcode console, I see the Array is iterated by the number of dictionaries. Why is this printing out 30 arrays each with 30 dictionaries?

Here is some some code that I have that is related to this issue. Let me know what your thoughts are and what I can do to improve on 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;
    }
}];

UPDATE

Here is the NSLogStatement that associates with this array. Please note that I'm logging this data from another method. This method is found below.

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

}

Here is the NSLog from the Console. Please note that this "Another Method NSLog" is called 30 times which is equal to the number of ConnectabilityObjects found in the JSON file.

    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>"
)

Solution

  • Yup. It's an NSLog mistake...

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

    In the first attempt, the OP code was doing this:

    NSMutableArray *objects = [NSMutableArray arrayWithArray:_objectlist];
    

    ... which needlessly copied the instance array var.

    And the OP code was doing this:

    self.objectlist = nil;
    

    ... which dangerously deletes the instance array that you're trying to inspect.

    And, generating confusing output, the OP code was doing this:

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

    ... which says: "for each element in my array, log my entire array".