Цепочка пересылки сообщений

Я прочитал документ Apple по пересылке сообщений и другие статьи, и кажется, что среда выполнения ObjC будет пересылать нераспознанные сообщения для объекта автоматически, и, если нет соответствующего селектора, он выдаст ошибку "нераспознанный селектор отправлен в экземпляр".

Но у меня есть два вопроса, которые я не могу объяснить.

  • Как среда выполнения находит следующий объект пересылки сообщений?
  • Кто-нибудь может объяснить цепочку пересылки сообщений ObjC?

2 ответа

Решение

и кажется, что среда выполнения ObjC будет пересылать нераспознанные сообщения для объекта автоматически

Вы неправильно поняли. Среда выполнения не находит "следующий" объект, она вызывает тот же объект forwardInvocation: метод. Вы можете реализовать этот метод в своем классе, если вы хотите, чтобы объект направлял определенные сообщения другому объекту, например, делегату.

Кто-нибудь может объяснить цепочку пересылки сообщений ObjC?

Возможно, вы путаете пересылку сообщений и цепочку респондента. Два не связаны. Какао и Какао Touch оба включают класс "респондента" (NSResponder а также UIResponder соответственно), который создает "цепочку" объектов, начиная с "первого респондента". Респонденты передают сообщения, которые они не внедряют, следующему респонденту в цепочке. Например, команды меню в Какао часто отправляют сообщения о действиях первому респонденту, который может быть чем-то вроде текстового поля или другого элемента пользовательского интерфейса. Если этот объект не обрабатывает действие, он передает его следующему респонденту и т. Д. До тех пор, пока сообщение не будет обработано каким-либо объектом или не достигнет конца цепочки (объекта приложения).

Считайте, что у вас есть объект obj. Во время выполнения, если вызов сообщения происходит с obj, ваш SDK вызывает

methodSignatureForSelector:

вашего объекта (так как любой класс унаследован от NSObject methodSignatureForSelector:

доступно для всего объекта). Если он возвращает объект NSMethodSignature, то ваш объект obj реализовал селектор, если он равен нулю, ваш SDK может привести к сбою приложения.

Другие вопросы по тегам