Цепочка пересылки сообщений
Я прочитал документ Apple по пересылке сообщений и другие статьи, и кажется, что среда выполнения ObjC будет пересылать нераспознанные сообщения для объекта автоматически, и, если нет соответствующего селектора, он выдаст ошибку "нераспознанный селектор отправлен в экземпляр".
Но у меня есть два вопроса, которые я не могу объяснить.
- Как среда выполнения находит следующий объект пересылки сообщений?
- Кто-нибудь может объяснить цепочку пересылки сообщений ObjC?
2 ответа
и кажется, что среда выполнения ObjC будет пересылать нераспознанные сообщения для объекта автоматически
Вы неправильно поняли. Среда выполнения не находит "следующий" объект, она вызывает тот же объект forwardInvocation:
метод. Вы можете реализовать этот метод в своем классе, если вы хотите, чтобы объект направлял определенные сообщения другому объекту, например, делегату.
Кто-нибудь может объяснить цепочку пересылки сообщений ObjC?
Возможно, вы путаете пересылку сообщений и цепочку респондента. Два не связаны. Какао и Какао Touch оба включают класс "респондента" (NSResponder
а также UIResponder
соответственно), который создает "цепочку" объектов, начиная с "первого респондента". Респонденты передают сообщения, которые они не внедряют, следующему респонденту в цепочке. Например, команды меню в Какао часто отправляют сообщения о действиях первому респонденту, который может быть чем-то вроде текстового поля или другого элемента пользовательского интерфейса. Если этот объект не обрабатывает действие, он передает его следующему респонденту и т. Д. До тех пор, пока сообщение не будет обработано каким-либо объектом или не достигнет конца цепочки (объекта приложения).
Считайте, что у вас есть объект obj. Во время выполнения, если вызов сообщения происходит с obj, ваш SDK вызывает
methodSignatureForSelector:
вашего объекта (так как любой класс унаследован от NSObject methodSignatureForSelector:
доступно для всего объекта). Если он возвращает объект NSMethodSignature, то ваш объект obj реализовал селектор, если он равен нулю, ваш SDK может привести к сбою приложения.