title: NSMutableDictionary<NSString*,NSMutableArray*>
body: <p>I am sorry, I am not good at English, maybe cann`t describ the problem clearly. Then the code is:</p>
  
  <p>I declared a property as my datasource </p>
  
  <pre><code> @property (nonatomic, strong)  NSMutableDictionary&lt;NSString*,NSMutableArray*&gt; *sectionData;
  </code></pre>
  
  <p>and initialized like  <code>self.sectionData[fir] = [NSMutableArray array];</code> make sure there is an NSMutableArray object in the dictionary. but when i fetch the data like</p>
  
  <pre><code>NSMutableArray *subArray =self.sectionData[self.sectionNames[indexPath.section]];
  NSLog(@"%@",NSStringFromClass([subArray class]));
  </code></pre>
  
  <p>the console shows: __NSArrayI<br>
  why is that happens, why is not NSMutableArray, and now I cannot delete the some Items in the datasource, </p>
  
  <p>The code that i add initialize my dataSource is :</p>
  
  <pre><code>- (NSMutableArray *)sectionNames
  {
      if (!_sectionNames) {
          _sectionNames = [NSMutableArray array];
          self.sectionData = [NSMutableDictionary dictionary];
          NSString *sourceStr = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"states" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];
  
          NSArray *states = [sourceStr componentsSeparatedByString:@"\n"];
          [states enumerateObjectsUsingBlock:^(NSString  * str, NSUInteger idx, BOOL * _Nonnull stop) {
  
              if ([str isNotNullOrWhiteSpace]) {
                  unichar chars[] = {[str characterAtIndex:0]};
                  NSString *fir = [[NSString stringWithCharacters:chars length:1] uppercaseString];
  
                  if (![_sectionNames containsObject:fir] &amp;&amp; ![fir isEqualToString:@""]) {
  
                      [_sectionNames addObject:[fir uppercaseString]];
                      self.sectionData[fir] = [NSMutableArray array];
                  }
                  [self.sectionData[fir] addObject:str];
              }
          }];
  
          //对sectionData中的array元素对象进行排序
          __weak typeof(self) weakSelf = self;
          [self.sectionData enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSMutableArray *obj, BOOL * _Nonnull stop) {
  
              weakSelf.sectionData[key] = [[obj sortedArrayUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
  
                  return [[obj1 uppercaseString] compare:[obj2 uppercaseString]];
              }] copy];
          }];
  
      }
      return _sectionNames;
  }
  </code></pre>
  
  <p>and then I delete some selected items:</p>
  
  <pre><code>- (void)doDelete:(UIBarButtonItem*)deleteBtn
  {
      NSArray *deletedIndexpathes = [self.collectionView indexPathsForSelectedItems];
      if (deletedIndexpathes.count == 0) return;
      //sort
      deletedIndexpathes = [deletedIndexpathes sortedArrayUsingSelector:@selector(compare:)];
      deletedIndexpathes = [[deletedIndexpathes reverseObjectEnumerator]allObjects];
  
      //delete data
      NSMutableIndexSet *emptySections = [NSMutableIndexSet indexSet]; // keep track of what sections get emptied
  
      [deletedIndexpathes enumerateObjectsUsingBlock:^(NSIndexPath  * indexPath, NSUInteger idx, BOOL * _Nonnull stop) {
  
          NSMutableArray *subArray =(NSMutableArray *)self.sectionData[self.sectionNames[indexPath.section]];
  
          NSLog(@"%@",NSStringFromClass([subArray class]));
  //        [ subArray removeObjectAtIndex: indexPath.item];
  
  //        NSLog(@"%@",self.sectionData[self.sectionNames[indexPath.section]]);
          //如果一个section里面没有item，追踪下来
  //        if (cArray.count == 0) {
  ////            [emptySections addObject:[NSNumber numberWithInteger:indexPath.section]];
  //            [emptySections addIndex:indexPath.section];
  //        }
      }];
  </code></pre>
  
  <p>but the subArray is an NSArray that I cann`t delete.... </p>