(…) нормально ли писать код, который объявляет, что возвращаемый метод должен быть одного типа, а фактический тип - другим?
Да, предоставляется типсовместимы;см. следующий абзацФактически, есть некоторые случаи в Какао (особенно кластеры классов), которые также делают это.
Это работает, потому что NSMutableArray является подклассом NSArray?
Точно,Поскольку NSMutableArray
является подклассом NSArray
, он наследует все свои методы и объявленные свойства, поэтому он публично ведет себя как NSArray
.Это называется принцип подстановки Лискова .
Является ли фактическое возвращаемое значение NSArray или NSMutableArray?
Возвращаемое значение - то, что вы 'возвращаюсь.Так как вы возвращаете NSMutableArray
, это NSMutableArray
.С точки зрения вызывающего, это объект, который можно использовать как NSArray
.