如何动态添加类方法?

时间:2012-02-21 12:43:40

标签: objective-c objective-c-runtime

使用Objective-C运行时,如何将方法+layerClass添加到私有UIGroupTableViewCellBackground类(而不是其超类UIView)?注意:这仅用于测试(查看UITableViewStyleGrouped如何设置单元格backgroundView& selectedBackgroundView)。

2 个答案:

答案 0 :(得分:17)

要动态添加类方法而不是实例方法,请使用object_getClass(cls)获取元类,然后将该方法添加到元类中。 E.g:

UIKIT_STATIC_INLINE Class my_layerClass(id self, SEL _cmd) {
    return [MyLayer class];
}

+ (void)initialize {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = object_getClass(NSClassFromString(@"UIGroupTableViewCellBackground"));
        NSAssert(class_addMethod(class, @selector(layerClass), (IMP)my_layerClass, "@:@"), nil);
    });
}

通过将+layerClass方法添加到UIGroupTableViewCellBackground类别并使用转发类定义(即@class UIGroupTableViewCellBackground)来进行编译,您也可以更轻松地完成此操作。

答案 1 :(得分:0)

试试这个魔法:

+ (void)load {
        class_addMethod(objc_getMetaClass("UIGroupTableViewCellBackground"), 
                        @selector(layerClass), (IMP)my_layerClass, "@:@"), nil);
    });
}