iOS替换系统方法的实现(runtime)

2016-03-15  本文已影响1821人  NextStep

很多iOS开发者都会遇到这么一个问题,当你调用系统的一个方法你发现这个方法的代码实现不满足你的需求(比如导航栏的返回,popViewControllerAnimated,我想在每次执行这个操作的时候发出一个通知),一般的想法就是继承当前类,重写这个方法,so如果你想你添加的方法在系统的实现之前呢,除了逻辑操作和继承能不能直接修改系统的方法呢?

可以的...Objective-C对象模型及应用

我写了一个NSMutableArray的category,下面是其中方法的实现,当然你要先导入#import <objc/runtime.h>

分类两个方法的实现

doExchange用来把NSMutableArray方法removeAllObjects的实现替换为newRemoveMethod的实现。

Method是一个结构体类型:

{SEL method_name,   //方法名字

char *method_types, //传入参数,返回值

IMP method_imp}      //方法实现的指针

调用:

NSMutableArray* tempArray = [@[@"1",@"2",@"3",@"4",@"5"]mutableCopy];

[tempArray doExchange];

[tempArray newRemoveMethod];

等一下,newRemoveMethod的实现为什么要[self newRemoveMethod]?

这样不会循环引用马上崩溃么。

这里要区分开如今newRemoveMethod内部实现已经是系统的removeAllObjects。

上一篇 下一篇

猜你喜欢

热点阅读