【问题标题】:How to implement the method "+ (BOOL)resolveClassMethod:(SEL)sel"如何实现方法“+ (BOOL)resolveClassMethod:(SEL)sel”
【发布时间】:2018-12-31 13:31:11
【问题描述】:

我正在学习运行时,当我编写以下代码时:

@implementation Son
- (instancetype)init
{
    self = [super init];
    if (self) {
    [self performSelector:@selector(sel) withObject:nil];
    }

    return self;
}

id dynamicMethodIMP(id self, SEL _cmd)
{
    NSLog(@"%s:dynamic method",__FUNCTION__);
    return @"1";
}
+ (BOOL)resolveInstanceMethod:(SEL)sel {
    class_addMethod(self.class, sel, (IMP)(dynamicMethodIMP), "@@:");
    [super resolveInstanceMethod:sel];
    return YES;
}
@end

它运行得很好。 但是当我编码时:

    @implementation Son
    id dynamicMethodIMP(id self, SEL _cmd)
    {
        NSLog(@"%s:dynamic method",__FUNCTION__);
        return @"1";
    }
    + (BOOL)resolveClassMethod:(SEL)sel {
        class_addMethod(self.class, sel, (IMP)(dynamicMethodIMP), "@@:");
        [super resolveClassMethod:sel];
        return YES;
    }    
    @end
    //Other file
    [Son performSelector:@selector(sel) withObject:nil];

它崩溃了:

+[Son sel]:发送到类 0x10da8a588 的未识别选择器

如何实现+ (BOOL)resolveClassMethod:(SEL)sel方法?

【问题讨论】:

    标签: objective-c runtime


    【解决方案1】:

    self.class 替换为object_getClass

    + (BOOL)resolveClassMethod:(SEL)sel {
        class_addMethod(object_getClass(self), sel, (IMP)(dynamicMethodIMP), "@@:");
        [super resolveClassMethod:sel];
        return YES;
    }
    

    原因:

    如果参数是类对象,object_getClass 将返回元类。

    如果你读中文,可以阅读我的blog,了解有关元类的更多详细信息。

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多