Помимо технических обсуждений выше, я думаю, что ответ связан с историей языка и его предпочтением соглашений по синтаксису.Формальные протоколы изначально не были частью языка - все было неформальным.Впоследствии Apple в основном перешла на формальные протоколы, но неформальные протоколы являются частью языка и используются частями официального API.Поэтому они являются полностью поддерживаемой частью первого класса Objective-C.
Если вы посмотрите на документацию по NSArray
, в ней, среди прочего, говорится:
В большинствеслучаи ваш пользовательский класс NSArray должен соответствовать соглашениям о владении объектами Cocoa.Таким образом, вы должны отправлять сохранение каждому объекту, который вы добавляете в свою коллекцию, и отпускать каждому объекту, который вы удаляете из коллекции.Конечно, если причиной создания подкласса NSArray является реализация поведения удержания объекта, отличного от нормы (например, невыдерживающий массив), то вы можете игнорировать это требование.
И:
NSArray «соединен бесплатно» со своим аналогом Core Foundation, CFArray [...], вы можете иногда делать вещи с CFArray, которые вы не можете легко сделать с NSArray.Например, CFArray предоставляет набор обратных вызовов, некоторые из которых предназначены для реализации пользовательского поведения retain-release.Если вы укажете реализации NULL для этих обратных вызовов, вы можете легко получить невыдерживающий массив.
Поэтому ваш вопрос основан на ложной предпосылке, в частности, либо частичном чтении документации, либо неполном рассмотренииязык.
id <NSObject>
правильно не используется, поскольку протокол NSObject
не соответствует протоколу, который объекты должны реализовывать, чтобы его можно было использовать с NSArray
.Вместо этого в документации установлен неформальный протокол, который является подмножеством NSObject
(хотя при втором удалении неформальности, что редко).Хотя неофициальные протоколы становятся все более редкими, они действительны и не являются исключительными.
Итак, короткая версия моего ответа: NSArray
документирует неофициальный протокол, этот протокол не совпадает с NSObject
.Неформальные протоколы не представлены в синтаксисе, поэтому id
.