Ответ 1
Apple NSObject isEqual document говорит:
Если два объекта равны, они должны иметь одинаковое значение хэша. Этот последний момент особенно важен если вы определяете isEqual: в подклассе и собираетесь помещать экземпляры этого подкласса в коллекцию. Убедиться вы также определяете хэш в своем подклассе.
Посмотрите следующий код:
NSIndexPath *indexPath1 = [NSIndexPath indexPathForRow:0 inSection:0];
NSIndexPath *indexPath2 = [NSIndexPath indexPathForRow:0 inSection:0];
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
NSLog(@"NSIndexPath isEqual Result: %d", [indexPath1 isEqual:indexPath2]);
NSLog(@"NSObject isEqual Result: %d", [obj1 isEqual:obj2]);
Результат вывода:
NSIndexPath isEqual Результат: 1
NSObject isEqual Результат: 0
Реализация NSObject isEqual заключается в том, что comare адрес двух объектов, и хэш-реализация - это адрес возвращаемого объекта.
NSIndexPath наследуется от NSObject, в соответствии с результатом NSIndexPath isEqual, Реализация NSIndexPath isEqual должна переопределять метод superclass isEqual, а NSIndexPath также переопределяет хэш-метод суперкласса.
В приложении NSIndexPath также соответствует протоколу NSCopying.
Таким образом, NSIndexPath может использоваться как класс ключа NSDictionary.