Похоже, instanceMethodSignatureForSelector
- метод класса, а метод methodSignatureForSelector
- это метод экземпляра. Однако их описание и варианты использования не приводят меня к такому выводу. Так в чем же разница?В чем разница между methodSignatureForSelector и instanceMethodSignatureForSelector?
ответ
Поскольку у нас достаточно информации о концепциях пересылки сообщений и сообщений, давайте обсудим это решение. В проекте, над которым я сейчас работаю, есть функция поиска. Пользователь может выполнять поиск по некоторым критериям. Этот критерий состоит из первичных и продвинутых критериев, а классы данных данных для обоих. Первичный datamodel будет содержать вторичный datamodel как свойство. Существует структура, которая заботится о сопоставлении таблиц базы данных с указанными datamodels. Чтобы сохранить или получить данные, инфраструктура будет отправлять сообщение в сопоставленный класс данных. Эта структура не поддерживает вложенные сопоставления. Основной класс datamodel сопоставляется с таблицей базы данных, поэтому инфраструктура ожидает, что столбцы будут сопоставлены с свойствами, и будет отправлять сообщения об установщике и получателе в основной класс данных. Решение состоит в том, чтобы сделать расширенную модель данных суррогатом первичной модели данных. В первичном классе datamodel путем переопределения следующих методов вторичная датамодель настраивается как суррогат для основного класса данных.
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature* signature = [super methodSignatureForSelector:selector];
if (!signature) {
signature = [surrogate instanceMethodSignatureForSelector:selector];
}
return signature;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
if ([surrogate respondsToSelector:[anInvocation selector]])
[anInvocation invokeWithTarget:surrogate];
else
[super forwardInvocation:anInvocation];
}
Если бы я использовал первоначальный подход ручного добавления сеттеров и добытчиков, я бы в конечном итоге писать так много методов, как удвоенное число свойств и должен был убедиться, что весь метод сигнатур подражают передовые критерии свойства , Любые изменения в имени свойств являются хорошей точкой входа для регрессии, и обслуживание кода будет беспорядочным. Другой подход заключается в том, чтобы поддерживать единую базу данных, которая будет представлять все критерии, которые будут создавать другие проблемы, поскольку требования к iPhone и iPad разные. Подход для пересылки сообщений уменьшил количество требуемых ручных усилий и будет масштабироваться, даже если есть изменения в датамоделях.
Refrence: http://blog.imaginea.com/message-forwarding-and-surrogate-objects-in-objective-c/
Хотя instanceMethodSignatureForSelector
это функция, которую вы хотите вызвать, чтобы получить подписи методов любого класса, в methodSignatureForSelector
является то, что вы бы в первую очередь overrride обеспечить альтернативные методы выполнения, если он смотрит вверх метод протокол.
(Ответ Джей дает пример этого, но я думал, что должен предложить это краткое объяснение, если вы еще не пришли к такому выводу.)