Короче говоря, <NSXMLParserDelegate>
в объявлении интерфейса не требуется , оно существует для проверки ошибок во время компиляции. Вызов setDelegate:
метода необходим , если вы хотите получать сообщения делегатов.
<delegateStuff>
, на которую вы ссылаетесь, является объявлением протокола. Протокол в Objective-C подобен интерфейсу в Java: он определяет список сообщений (методов), на которые отвечает класс. Однако, в отличие от Java, Objective-C имеет динамическую типизацию, что означает, что любое сообщение может быть отправлено любому объекту, и вы можете быть уверены только в том, что оно ответит на него во время выполнения.
Результатом этого является то, что если метод, подобный setDelegate:
, запрашивает параметр типа id
, вы можете присвоить ему любой объект. Код в NSXMLParser может проверить, может ли он ответить на конкретное сообщение перед его отправкой. Таким образом, вы можете реализовать любые методы делегирования, которые вы хотите. (Поскольку Java имеет более строгую проверку типов, вы должны реализовать все методы в интерфейсе, нужны они вам или нет.)
Если setDelegate:
вместо этого действует для типа id <NSXMLParserDelegate>
, то теперь он говорит, что ему нужен объект, реализующий протокол NSXMLParserDelegate. Это проверяется только во время компиляции, чтобы помочь вам отлавливать ошибки. Если вы используете Typecast, вы можете отправить туда любой объект, и, пока он отвечает на требуемые сообщения, ваша программа будет работать нормально. (Опять же, в Java вы можете использовать трансляцию типов для компиляции, но сама трансляция типов выдает исключение, если объект имеет неправильный тип, даже если он имеет те же методы.)
Кстати, вы подкласс NSXMLParser? (Я так полагаю, поскольку вы передаете self
в setDelegate:
. Это не тот способ, которым он предназначен для использования! Каркасы Какао обычно предпочитают делегатов над подклассами. Ваш класс делегата должен быть отдельный класс, расширяющий NSObject (или что-то еще, если хотите).