当前位置: 首页 > news >正文

开发网站实时监控好用的搜索引擎

开发网站实时监控,好用的搜索引擎,苹果应用商店,求生之路2怎么做非官方网站偶然在stackoverflow上看到有人问“如何用类别覆盖一个o-c类的方法,同时在这个方法中调用其原来的实现?”。例如: // Base Class interface ClassA : NSObject - (NSString *) myMethod; end implementation ClassA - (NSString*) myMethod…

偶然在stackoverflow上看到有人问“如何用类别覆盖一个o-c类的方法,同时在这个方法中调用其原来的实现?”。例如:

// Base Class

@interface ClassA : NSObject

- (NSString *) myMethod;

@end

@implementation ClassA

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

@end

 

//Category

@interface ClassA (CategoryB)

- (NSString *) myMethod;

@end

@implementation ClassA(CategoryB)

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

@end

类A中有一个方法myMethod,如果用类别B覆盖类A的myMethod方法,这是很容易做到的。但问题是,我想在类别方法myMethod中,还要调用类A的默认实现,即return@"A";一句,这该怎么办?

这是一个很有趣的问题。实际上,仅仅用O-C的类别机制我们无法做到这一点。因为类别的方法覆盖是完全覆盖,如果你在类别中重写了类方法,则类方法原来的实现就完全被替代了。

你也许想到了self关键字。比如在类别方法中这样写:

- (NSString*) myMethod {

return [[self myMethod]stringByAppendingString:@"B"];

}

这会导致一个myMethod方法的循环调用。因为在类别看来,ClassA的myMethod方法已经被类别替换掉了,[self myMethod]调用的仍然是类别的实现,而不是类的实现。

如果使用[super myMethod]呢?类别并不是继承,CategoryB并不是ClassA的子类,它仍然是ClassA类。那么super指向的仍然是ClassA的父类,即NSObject。NSObject中并没有myMethod方法,O-C会报一个错误。

解决这个问题的最终答案是“方法混合”。即mac osx 10.5以后的新的运行时API“Method Swizzling”。

Swizzling一词是“搅动、混合”之意,常用于鸡尾酒制作。所以Method Swizzling其实是方法混合或方法交换。

我们先来看一个简单的例子。这个例子来自于Andras的博客 http://codeshaker.blogspot.com/2012/01/calling-original-overridden-method-from.html:

假设有一个类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,如下图所示。

有了这样的理解,我们再来看logLength方法代码:

第一句,调用实例的logLength方法。由于“鸡尾酒效果”,这实际上是调用了length方法的实现,于是我们得到了数字4571。

第二句,是logLength方法增加的行为,即打印数字4571,当然你也可以改成任意原来的length方法以外的行为。

第三句,返回length方法的调用结果。

在main.m方法中,我们调用Test的length方法(别忘记导入类别的头文件Test+Log.h);

Test* test=[[Testalloc]init];

[test length];

由于“鸡尾酒效果”,[test length];实际上调用了类别的logLength方法的实现。于是运行结果除了得到4571的结果外,还会打印出这个数字:

2012-12-14 11:07:04.229SwizzlingTest[49905:207] Test Logging: 4571

 

我将这个例子的源代码放在了这里:

http://download.csdn.net/detail/kmyhy/4886485

 

 

 

http://www.lbrq.cn/news/2806003.html

相关文章:

  • 武汉做网站的大公司有哪些产品推广朋友圈文案
  • 西安小型企业网站建设宁波最好的seo外包
  • 漂亮的幼儿园网站模板网络营销推广的渠道有哪些
  • 怎么提高网站百度权重怎么做蛋糕
  • 十大传媒公司排名正版seo搜索引擎
  • 怎么用ps做静态网站网站seo诊断技巧
  • 邯郸专业做网站哪里有百度投诉中心24人工
  • java可以用来做网站吗百度上海分公司
  • 淘宝网页版电脑版登录入口东莞seo代理
  • 南宁网站建设云尚网络百度权重是什么
  • 做调查问卷的网站什么是软文写作
  • 广州专业做网站网络营销模式有哪些
  • 长沙商城小程序开发网站排名在线优化工具
  • 制作网站空间域名优化的定义
  • 怎样利用网站做引流广告营销案例分析
  • 做网站改版多少钱域名注册服务网站
  • 如何做网站的需求分析网络广告四个特征
  • 用护卫神做网站友谊平台
  • 麻烦各位童鞋视频优化是什么意思
  • 做什么网站营销型网站建设模板
  • 定制化网站建设个人免费建站软件
  • 建设企业网站的时间百度热搜广告位
  • 苗木网站建设短视频seo优化排名
  • 成全免费观看在线看站内seo优化
  • 外贸做企业什么网站建设关键词搜索指数
  • 动物园网站建设的可行性分析app推广实名认证接单平台
  • 做logo的比赛网站管理方面的培训课程
  • 五屏网站建设如何论坛推广怎么做
  • wordpress企业官网主题下载网络优化工程师前景如何
  • 鞍山做网站的慧聪网seo页面优化
  • Linux 软件编程(九)网络编程:IP、端口与 UDP 套接字
  • FileCodeBox 文件快递柜 一键部署
  • 使用 TensorBoardX 实现 PyTorch 神经网络可视化:从入门到进阶
  • 多级缓存一致性矩阵:ABP vNext 下的旁路 / 写穿 / 写回组合实战
  • Linux: network: arp: arp_accept
  • VR交通安全学习机-VR交通普法体验馆方案