Мне кажется, вы озадачены двумя аспектами этого. Один из них связан с распределением пространства, на которое был адресован ряд других ответов. Подводя итог, можно сказать, что объявление ссылки в объектно-ориентированной системе не выделяет пространство для хранения объекта этого типа, оно просто выделяет пространство для хранения указателя.
Другая проблема, которую вы, похоже, смущаете, - это то, что на самом деле означает типизация в объектно-ориентированной системе.
Я бы понял по-другому: Большой
жирный NSMutableArray на левой стороне, и
крошечный NSArray и право.
Думайте о любом классе как о двух отдельных вещах: интерфейсе, который представляет собой набор методов и членов, которые он предоставляет, и реализации, которая определяет, какой доступ к этим методам и члену будет фактически выполняться.
Когда вы объявляете ссылку на NSArray, это означает, что ссылка будет указывать на объекты, которые поддерживают тот же интерфейс, что и NSArray. Поскольку NSMutableArray является подклассом NSArray, экземпляры NSMutableArray всегда будут поддерживать интерфейс NSArray. Поэтому назначение безопасно.
И наоборот, если вы объявляете ссылку на NSMutableArray, она должна указывать на объекты, которые поддерживают интерфейс подкласса. Следовательно, вы не можете назначить указатель на экземпляр NSArray для этой переменной, потому что NSArray не поддерживает полный интерфейс NSMutableArray. (В слабо типизированной системе возможно, что вы можете выполнить присваивание, но затем получите ошибку времени выполнения, если попытаетесь вызвать метод, который существует в интерфейсе, но не в экземпляре объекта. Я не знаю, насколько сильно типизирован Objective С есть.)