2016-06-14 3 views
0

Это странная проблема, и я работал над попыткой исправления различных проблем/исправления ошибок. Но я потратил немало времени на это и надеюсь, что кто-то с новыми глазами может потенциально определить основную причину этой проблемы.Почему мой NSArray выполняет итерацию в соответствии с количеством NSDictonaries

В основном я сериализую файл JSON как NSArray. Мне нужно сделать некоторые манипуляции с этими данными, поэтому я создаю NSMutableArray этого оригинального NSArray.

Затем я создаю NSDictonary и сравниваю objectForKey's.

Тем не менее, я заметил, что когда я выводю через инструкцию NSLog в консоли Xcode, я вижу, что массив повторяется по количеству словарей. Почему это печатает 30 массивов с 30 словарями?

Вот какой-то код, который у меня есть, связанный с этой проблемой. Дайте мне знать, что вы думаете и что я могу сделать, чтобы улучшить это/исправить.

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

Вот NSLogStatement, что ассоциируется с этим массивом. Обратите внимание, что я регистрирую эти данные по другому методу. Этот метод описан ниже.

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

}

Здесь NSLog из консоли. Обратите внимание, что этот «Другой метод NSLog» называется 30 раз, что равно количеству объектов ConnectabilityObject, найденных в файле JSON.

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

Непонятно. У вас есть 'for loop', и ваш код не должен компилироваться, вы делаете' [array addObject: object]; 'где' object' не объявлен. – Larme

+4

Вопрос о неожиданном выходе NSLog должен содержать хотя бы одну инструкцию NSLog. – danh

+0

Убедитесь, что у вас еще нет переменной с именем 'object', например @Larme,' [array addObject: object] 'не следует компилировать на основе этого кода, потому что ваш объект' ConnectabilityObject * 'не будет доступен в таком случае. – Wyatt

ответ

1

Yup. Это ошибка NSLog ...

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

В первой попытке, код OP делает это:

NSMutableArray *objects = [NSMutableArray arrayWithArray:_objectlist]; 

... который понапрасну скопировал вар массив экземпляра.

И код OP делает это:

self.objectlist = nil; 

... который опасно удаляет массив экземпляра, который вы пытаетесь осмотреть.

И, создавая запутанный выход, код OP делает это:

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

... который говорит: «для каждого элемента в моем массиве, бревенчатым весь мой массив».

+0

Спасибо! Вы вызвали мой мыслительный процесс, вы были правы, я ввел это неправильно. Я отметил ваш ответ как правильный и приоритетный. Еще раз спасибо! –