iOS交换系统方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18683985/article/details/82470374

交换系统方法也属于runtime的一部分

1.首先导入runtime

    #import <objc/runtime.h>

2.取出系统方法与你写的方法

    Method systemMethod = class_getInstanceMethod(self, @selector(systemMethod));
    Method my_Method = class_getInstanceMethod(self, @selector(my_Method));

3.交换方法

    method_exchangeImplementations(systemMethod, my_Method);

注:

1.对于一般的Class.推荐交换load方法

    + (void)load {
        Method systemMethod = class_getInstanceMethod(self, @selector(systemMethod));
        Method my_Method = class_getInstanceMethod(self, @selector(my_Method));
        method_exchangeImplementations(systemMethod, my_Method);
    }

2.调用需要调用先使用系统的方法初始化调用[self xxx]的系统方法的时候.需要把xxx改成my_xxx(你交换的方法)
这里是因为你的方法已经和系统的方法交换了,调用你的方法其实是调用的系统方法,调用系统方法的话就调用的是你的方法,然后就会产生循环引用.

    ///例如
    - (void)layoutSubviews {
        [super layoutSubviews];
    }

    - (void)my_layoutSubviews {

        ///// 如果这么写,调用的就是my_layoutSubviews.就会循环引用.
        //[self layoutSubviews];

        // 正确写法
        [self my_layoutSubviews];
    }

猜你喜欢

转载自blog.csdn.net/qq_18683985/article/details/82470374
今日推荐