Ответ 1
Objective-C - это своего рода гибридный язык, в котором вы можете быть как динамическим, так и статическим, как вы хотите. Вы можете объявить все типы всех переменных, если хотите, вы можете даже объявить делегатные переменные как NSObject <Protocol> *, если хотите. Тип id работает меньше как реальный тип и больше похож на подсказку компилятору, говоря ему: "Эй, я знаю, что я делаю, просто доверь мне на это", заставляя компилятор избегать любого типа проверяя эту конкретную переменную.
Первым очевидным преимуществом системы типа Objective-C является то, что типы контейнеров (NSArray, NSDictionary, NSSet) принимают и возвращают типы идентификаторов. Это полностью устраняет необходимость в шаблонах и генериках (например, в С++, Java и С#).
Даже лучше, вы можете иметь контейнеры с элементами любого типа внутри. Пока вы знаете, что входит внутрь, никто не будет жаловаться, если вы добавите два NSStrings, один NSNumber и NSValue внутри того же NSArray. Вы можете сделать это на других языках, но вам нужно использовать базовый класс "Объект" или тип void *, а затем вам нужно вставлять и удалять (или перебрасывать вверх) вниз переменные, чтобы получить такое же поведение. В Objective-C вы просто назначаете, который удаляет шум, создаваемый операторами литья и бокс-операциями. Затем вы можете спросить "replysToSelector:" или "class" для каждого объекта, чтобы узнать идентификатор и операции, которые вы можете выполнять с ними, во время выполнения. В Objective-C отражение является гражданином первого класса.
Другим преимуществом является сокращение времени компиляции; компиляция программы Objective-C, как правило, намного быстрее, чем ее эквивалент в С++, учитывая, что не так много проверок типов, и много ссылок выполняется во время выполнения. Компилятор больше доверяет программисту.
Наконец, Objective-C система динамического типа позволяет иметь такой инструмент, как Interface Builder. Это основная причина, по которой Cocoa и Cocoa Touch имеет более быстрое время разработки; GUI может генерировать код с типами "id" повсеместно, и это десериализуется всякий раз, когда NIB загружается в память. Единственный язык, который близок к Objective-C с точки зрения дизайна интерфейса, - это С# (и VB.NET, конечно), но по цене гораздо более тяжелого приложения.
Я лично предпочитаю работать с более статическим типом проверки, и даже включил параметр "Обращаться с предупреждением как ошибки" в компиляторе Objective-C; Я написал сообщение в блоге об этом:
http://akosma.com/2009/07/16/objective-c-compiler-warnings/
Это особенно полезно, когда вы работаете с разработчиками, которые не знакомы с языком. Это заставляет компилятор скулить чаще обычного:)
Специалисты из статического типа могут не соглашаться со всеми этими пунктами, утверждая, что проверка статического типа позволяет использовать IDE Intellisense и улучшать обслуживание в целом. Я работал с .NET на протяжении многих лет (2001-2006), и я должен сказать, что динамические языки имеют тенденцию создавать меньше кода, читать легче и в целом дают больше свободы для работы. Компромисс (всегда есть компромисс) заключается в том, что во время компиляции меньше информации. Но, как я обычно говорю, компиляторы - это плохой набор тестов. Лучшее, что у ИМХО - это хороший набор тестов, и хорошая группа тестировщиков людей, пытающих ваш код, найти ошибки, независимо от того, какой язык вы выберете.