Я согласен с "wm". Очень хорошее решение - поместить все реализации по умолчанию в интерфейс (с тем же именем, что и протокол).В методе «+ initialize» любого подкласса он может просто скопировать в себя любые не реализованные методы из интерфейса по умолчанию.
Следующие вспомогательные функции сработали для меня
#import <objc/runtime.h>
// Get the type string of a method, such as "v@:".
// Caller must allocate sufficent space. Result is null terminated.
void getMethodTypes(Method method, char*result, int maxResultLen)
{
method_getReturnType(method, result, maxResultLen - 1);
int na = method_getNumberOfArguments(method);
for (int i = 0; i < na; ++i)
{
unsigned long x = strlen(result);
method_getArgumentType(method, i, result + x, maxResultLen - 1 - x);
}
}
// This copies all the instance methods from one class to another
// that are not already defined in the destination class.
void copyMissingMethods(Class fromClass, Class toClass)
{
// This gets the INSTANCE methods only
unsigned int numMethods;
Method* methodList = class_copyMethodList(fromClass, &numMethods);
for (int i = 0; i < numMethods; ++i)
{
Method method = methodList[i];
SEL selector = method_getName(method);
char methodTypes[50];
getMethodTypes(method, methodTypes, sizeof methodTypes);
if (![toClass respondsToSelector:selector])
{
IMP methodImplementation = class_getMethodImplementation(fromClass, selector);
class_addMethod(toClass, selector, methodImplementation, methodTypes);
}
}
free(methodList);
}
Затем вы вызываете егов вашем инициализаторе класса, таком как ...
@interface Foobar : NSObject<MyProtocol>
@end
@implementation Foobar
+(void)initialize
{
// Copy methods from the default
copyMissingMethods([MyProtocol class], self);
}
@end
Xcode выдаст вам предупреждения об отсутствующих методах Foobar, но вы можете их игнорировать.
Эта техника копирует только методы, а не ивары.Если методы обращаются к несуществующим элементам данных, вы можете получить странные ошибки.Вы должны убедиться, что данные совместимы с кодом.Это как если бы вы сделали reinterpret_cast из Foobar в MyProtocol.