IOS 获取父类的所有子类 全局替换类方法

来源:互联网 发布:移动数据终端 市场 编辑:程序博客网 时间:2024/06/08 16:23
1、获取父类的所有子类-(void)getSubclass{    int numClasses;    Class *classes = NULL;    numClasses = objc_getClassList(NULL,0);    if (numClasses >0 )    {        classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);        numClasses = objc_getClassList(classes, numClasses);        for (int i = 0; i < numClasses; i++) {            if (class_getSuperclass(classes[i]) == [BaseTableViewController class]){                NSLog(@"%@===%@",classes[i], NSStringFromClass(classes[i]));            }        }        free(classes);    }}2、在添加页面统计等时,直接在父类实现添加方法,但是要读到子类的类名比如在父类中添加友盟页面统计-(void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    NSLog(@"%@",[NSString stringWithUTF8String:object_getClassName(self)]);    [MobClick beginLogPageView:[NSString stringWithUTF8String:object_getClassName(self)]];}-(void)viewWillDisappear:(BOOL)animated{    [super viewWillDisappear:animated];    [MobClick endLogPageView:[NSString stringWithUTF8String:object_getClassName(self)]];}3、如果要实现添加统计跟踪等,除了在基类实现,还可以通过Method Swizzling来实现   首先建个UIViewController的扩展类#import "UIViewController+Log.h"#import@implementation UIViewController (Log)+ (void)load {    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        Class class = [self class];        // When swizzling a class method, use the following:        // Class class = object_getClass((id)self);        SEL originalSelector = @selector(viewDidAppear:);        SEL swizzledSelector = @selector(xxx_viewDidAppear:);        Method originalMethod = class_getInstanceMethod(class, originalSelector);        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);        BOOL didAddMethod =        class_addMethod(class,                        originalSelector,                        method_getImplementation(swizzledMethod),                        method_getTypeEncoding(swizzledMethod));        if (didAddMethod) {            class_replaceMethod(class,                                swizzledSelector,                                method_getImplementation(originalMethod),                                method_getTypeEncoding(originalMethod));        } else {            method_exchangeImplementations(originalMethod, swizzledMethod);        }    });}#pragma mark - Method Swizzling- (void)xxx_viewDidAppear:(BOOL)animated {    [self xxx_viewDidAppear:animated];    NSLog(@"viewWillAppear: %@", self.title);}

原网址 :http://blog.sina.com.cn/s/blog_881ed8500102vy7g.html

0 0
原创粉丝点击