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