设为首页 加入收藏

TOP

Runtime的几个小例子(含Demo)(四)
2017-10-13 10:32:58 】 浏览:4634
Tags:Runtime 例子 Demo
tton *)sender;

在ViewController.m中的实现如下:

/*5.添加新的方法试试(这种方法等价于对Father类添加Category对方法进行扩展):*/
- (IBAction)addMethod:(UIButton *)sender { /* 动态添加方法: 第一个参数表示Class cls 类型; 第二个参数表示待调用的方法名称; 第三个参数(IMP)myAddingFunction,IMP一个函数指针,这里表示指定具体实现方法myAddingFunction; 第四个参数表方法的参数,0代表没有参数; */ class_addMethod([per class], @selector(NewMethod), (IMP)myAddingFunction, 0); //调用方法 【如果使用[per NewMethod]调用方法在ARC下会报“no visible @interface”错误】
 [per performSelector:@selector(NewMethod)]; } //具体的实现(方法的内部都默认包含两个参数Class类和SEL方法,被称为隐式参数。)
int myAddingFunction(id self, SEL _cmd) { NSLog(@"已新增方法:NewMethod"); return 1; }

点击按钮后,控制台输出:

2016-05-20 14:08:55.822 runtime运行时[1957:34730] 已新增方法:NewMethod

 

 6.交换person类的2个方法的功能:

 将第六个按钮关联到ViewController.h,添加行为并命名其方法为:“replaceMethod”:

- (IBAction)replaceMethod:(UIButton *)sender;

在ViewController.m中的实现如下:

/* 6.交换两种方法之后(功能对调),可以试试让苹果乱套... */
- (IBAction)replaceMethod:(UIButton *)sender { Method method1 = class_getInstanceMethod([person class], @selector(func1)); Method method2 = class_getInstanceMethod([person class], @selector(func2));
//交换方法 method_exchangeImplementations(method1, method2); [per func1];
//输出交换后的效果,需要对比的可以尝试下交换前运行func1; }

点击按钮后,控制台输出:

2016-05-20 14:11:57.381 runtime运行时[1957:34730] 执行func2方法。

交换方法的使用场景:项目中的某个功能,在项目中需要多次被引用,当项目的需求发生改变时,要使用另一种功能代替这个功能,且要求不改变旧的项目(也就是不改变原来方法实现的前提下)。那么,我们可以在分类中,再写一个新的方法(符合新的需求的方法),然后交换两个方法的实现。这样,在不改变项目的代码,而只是增加了新的代码的情况下,就完成了项目的改进,很好地体现了该项目的封装性与利用率。

注:交换两个方法的实现一般写在类的load方法里面,因为load方法会在程序运行前加载一次。

 

 

首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇iOS UIScrollView的使用 下一篇iOS开发UI篇-tableView在编辑状态..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目