iOS10和iOS11(测试版)中的NSArray []与NSMutableArray []

我们发现iOS从NSMutableArray中使用“ [index]”获取元素,该元素在iOS10和iOS11(测试版)之间的实现方式有所不同。

NSMutableArray []:iOS10(objectAtIndex :),iOS11( objectAtIndexedSubscript :)

码:

  NSMutableArray * testArray = [NSMutableArray array];  NSLog(testArray [0]); 

在iOS 10中:

  2017–06–19 08:58:17.718 TestApp [24113:355722] ***由于未捕获的异常“ NSRangeException”而终止应用程序,原因:“ ***-[__ NSArrayM objectAtIndex:]:索引0超出了空数组的范围” 
***首先抛出调用堆栈:
(...
2 CoreFoundation 0x0000000106a5c05b-[__ NSArrayM objectAtIndex:] + 203

在iOS 11中:

  2017–06–19 09:03:05.142104 + 0800 TestApp [24349:359934] ***由于未捕获的异常“ NSRangeException”而终止应用程序,原因:“ *** _deque_objectAtIndex:索引0超出了空数组的边界” 
  ***首先抛出调用堆栈: 
  (... 
  3 CoreFoundation 0x000000010f33ca64-[ __NSArrayM objectAtIndexedSubscript :] + 148 

您可以看到使用[[]”从NSMutableArray获取元素,它将在ios 10( objectAtIndex:)和ios 11( objectAtIndexedSubscript:)之间调用不同的方法。

NSArray呢?

NSArray []:iOS10(objectAtIndex :),iOS11(objectAtIndex 🙂

  NSArray * testArray = [[NSArray alloc] init]; 
  NSLog(testArray [0]); 

在iOS 10中

  2017–06–19 08:56:08.606 TestApp [23892:352223] ***由于未捕获的异常“ NSRangeException”而终止应用程序,原因:“ ***-[__ NSArray0 objectAtIndex:]:索引0超出了空NSArray的范围” 
  ***首先抛出调用堆栈: 
  (... 
  2 CoreFoundation 0x000000010df8227d-[__ NSArray0 objectAtIndex :] + 93 

在iOS 11中

  2017–06–19 09:04:08.902340 + 0800 TestApp [24406:361500] ***由于未捕获的异常'NSRangeException'而终止应用程序,原因:'***-[__ NSArray0 objectAtIndex:]:索引0超出范围为空NSArray” 
  ***首先抛出调用堆栈: 
  (... 
  2 CoreFoundation 0x000000011326799d-[__ NSArray0 objectAtIndex :] + 93 

您可以看到使用[[]”从NSArray获取元素,它将在ios 10和ios 11之间调用相同的方法( objectAtIndex:)

结论

如果要混淆NSMutableArray [],则在iOS 11中,需要混淆objectAtIndexedSubscript: