利用Runtime为已经存在的分类方法取消前缀

1、列出需要去掉前缀的方法所在的类

+ (NSArray *)classesToSwizzle{    return @[ [NSManagedObject class],
              [NSManagedObjectContext class],
              [NSManagedObjectModel class],
              [NSPersistentStore class],
              [NSPersistentStoreCoordinator class] ];}
复制代码

2、hook每个类的resolveClassMethod:和resolveInstanceMethod:方法

3、实现自定义MR_resolveClassMethod:和MR_resolveInstanceMethod:方法,在方法中对于所调用的没有前缀的方法进行添加

static BOOL MRAddShorthandMethodForPrefixedInstanceMethod(Class objectClass, SEL originalSelector, NSString *prefix){    NSString *originalSelectorString = NSStringFromSelector(originalSelector);    if ([originalSelectorString hasPrefix:prefix] == NO &&        ([originalSelectorString hasPrefix:@"_"] || [originalSelectorString hasPrefix:@"init"]))    {        NSString *prefixedSelector = [prefix stringByAppendingString:originalSelectorString];        Method existingMethod = class_getInstanceMethod(objectClass, NSSelectorFromString(prefixedSelector));        if (existingMethod)        {            BOOL methodWasAdded = class_addMethod(objectClass,                                                  originalSelector,                                                  method_getImplementation(existingMethod),                                                 method_getTypeEncoding(existingMethod));            return methodWasAdded;        }    }    return NO;}
复制代码

参考MagicalRecord (ShorthandMethods)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享