2016-09-16 8 views
1

Недавно я модернизировал XCode8 я столкнулся вопрос в isKindOfClass методе этот код работает до в iOS9, но в iOS10 вдруг [items isKindOfClass: [NSMutableArray class]] компилятор не собирается для условия цикла может я знаю, в чем причина?Выпуск облицовочный в isKindOfClass в iOS10

NSMutableArray является класс ребенок NSArray поэтому, когда я меняюсь к [NSArray class] то он работает нормально, так что я путаю почему это изменение влияет на NSMutableArray класса, который является классом ребенок NSArray?

 NSMutableArray *items = [jsonDictionary objectForKey:@"items"]; // Here i am taking response in NSMutableArray 

    if ([items isKindOfClass: [NSMutableArray class]] && items != nil) // not working { 
     for (NSMutableDictionary *item in items) 
     { 
      // Rest of Code 
     } 
    } 

Этот код работает для меня, я м запутать выше код не работает до тех пор iOS9, когда я изменить ниже код, то после работы в iOS10:

 NSMutableArray *items = [jsonDictionary objectForKey:@"items"]; 

    if ([items isKindOfClass: [NSArray class]] && items != nil) // Changed to NSArray { 
     for (NSMutableDictionary *item in items) 
     { 
      // Rest of Code 
     } 
    } 
+0

Как вы разбираете JSON? Вы устанавливаете опцию для изменяемых контейнеров? Установили ли вы точку останова и проверили с помощью отладчика, какие «предметы» на самом деле? Все доказательства указывают на то, что они являются «NSArray», а не «NSMutableArray» – Paulw11

+0

@ Paulw11 Yesi проверили все вещи, которые я проверил с элементами debuger, имеют элементы и этот 1-й блок кода, работающий до iOS9, и я проверил с отладчик, когда я изменил NSMutableArray на NSArray, тогда он будет работать нормально, и это произошло только в iOS10 –

+0

Итак, что такое класс 'items', показанный в отладчике? – Paulw11

ответ

2

От ваших комментариев, кажется, что вы на самом деле NSArray, а не NSMutableArray, поэтому isKindOfClass работает правильно. AFN предоставит неизменяемые контейнеры, если вы не укажете иное, и это не должно быть ничем иным в iOS 10, поэтому я не уверен, почему он работал ранее.

Вместо того, чтобы проверять на изменяемый массив, это, вероятно, проще создать изменяемую копию того, что есть, таким образом, вы не должны пытаться справиться с «провал» состояние изящно:

NSArray *items = [jsonDictionary objectForKey:@"items"]; 
if (items != nil) { 
    NSMutableArray *mutableItems = [items mutableCopy]; 
    for (NSMutableDictionary *item in mutableItems) 
    { 
     // Rest of Code 
    } 
} 

Опасайтесь, если вы не указали опцию AFN для предоставления изменяемых контейнеров, словари внутри вашего массива items будут NSDictionary, а не NSMutableDictionary, поэтому вам может потребоваться изменить их.

Конечно, если вы не мутируете массив или словарь, вы можете просто u NSArray и NSDictionary независимо от того, есть ли у вас изменяемый или неизменяемый объект.