ios 分类中如果增加的方法与被扩展的类方法名重复,则原方法就没法被调用….看以下例子

例如:

@interface ClassA : NSObject

- (NSString *) myMethod;

@end

@implementation ClassA

- (NSString*) myMethod {return @”class A”; }

@end

//Category

@interface ClassA (CategoryB)

- (NSString *) myMethod;

@end

@implementation ClassA(CategoryB)

- (NSString*) myMethod {return @” class B”; }

@end

当 调用 [ClassA  myMethod] 时候 会返回 class B .. 因为原类中的方法被扩展完全重写,如果用户想要执行原类中的myMethod方法, cocoa中用类似类交换的方法解决这一问题 称为MethodSwizzling。Swizzling一词是“搅动、混合”之意,常用于鸡尾酒制作。所以Method Swizzling其实是方法混合或方法交换。假设有一个类Test,它有一个方法length:

-(NSUInteger)length{

return 4571;

}

我们想为Test定义一个类别,并覆盖这个方法,但同时,我们还想调用Test类的默认实现。因此我们可以这样写:

#import<objc/runtime.h>

@implementation Test(Logging)

- (NSUInteger)logLength {

NSUInteger length = [self logLength];

NSLog(@”Test Logging: %d”, length);

return length;

}

+ (void)load {

method_exchangeImplementations(class_getInstanceMethod(self,@selector(length)), class_getInstanceMethod(self, @selector(logLength)));}

@end

提示: swizzling无法在类簇上使用。

首先看load方法。在load方法中我们调用了鸡尾酒魔法“method_exchangeImpementations”函数。这个函数将实例方法(在这里,其实是类别方法)length和logLength方法的实现进行交换。也就是说,当我们调用length时,实际上是调用logLength,当我们调用logLength时,实际上是调用length。

实际上,一个方法的方法名和方法体是分开的。方法体是花括号 {} 之间的代码,即方法的 IMP,而在这之前的是方法名,即 SEL。通常情况下,SEL 是与 IMP 匹配的,但在 swizzling之后,length方法的SEL还是叫做length,但IMP却变成了logLength的IMP,logLength的IMP却变成了length的IMP.

最新文章

  1. 学术作为一种志业 马克斯&#183;韦伯Max Weber。
  2. selenium webdriver自动化测试
  3. SQL Server中中数据行批量插入脚本的存储实现
  4. nssm在windows服务器上部署nodejs,coffee启动方式
  5. 在C#中实现Python的分片技术
  6. HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容
  7. Java API设计CheckList
  8. 深入浅出 JSTL
  9. 如何使用git
  10. zoj-3782-Ternary Calculation
  11. java笔记----获取电脑上ip(内网ip)
  12. centos 6.8 配置 Redis3.2.5
  13. vuex学习
  14. git-bash的alias别名设置
  15. python中模块的__all__详细使用
  16. app模块设计
  17. 渗透测试的理论部分2——OSSTMM的详细描述
  18. go标准库的学习-crypto/md5
  19. dp练习2
  20. 【洛谷】1852:[国家集训队]跳跳棋【LCA】【倍增?】

热门文章

  1. laravel5.2总结--路由
  2. Dcgpofix
  3. Leetcode 632.最小区间
  4. c#中dynamic ExpandoObject的用法
  5. C#知识点&lt;4&gt;
  6. javascript原生360 开机小动画
  7. 多IP指定出口IP地址 如何指定云服务器源IP?
  8. hdu6136[模拟+优先队列] 2017多校8
  9. 【距离GDOI:136天】 后缀数组中...
  10. wooyun