[转]修改父类已经存在的方法(添加自己的处理流程或者直接重写),比category更犀利...

http://www.devdiv.com/%E4%BF%AE%E6%94%B9%E7%88%B6%E7%B1%BB%E5%B7%B2%E7%BB%8F%E5%AD%98%E5%9C%A8%E7%9A%84%E6%96%B9%E6%B3%95_%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%B7%B1%E7%9A%84%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B%E6%88%96%E8%80%85%E7%9B%B4%E6%8E%A5%E9%87%8D%E5%86%99_%EF%BC%8C%E6%AF%94category%E6%9B%B4%E7%8A%80%E5%88%A9-article-1644-1.html

 

摘要: 第一帖,实在想不到好一点的标题来表达这么劲爆的内容。 前两天看Safari AdBlock源码的时候学到的,觉得比较犀利,也比较实用。 category大家肯定都熟(不熟悉的请学好Objective-C基础教程),可以为已有类型创建 ...
第一帖,实在想不到好一点的标题来表达这么劲爆的内容。

前两天看Safari AdBlock源码的时候学到的,觉得比较犀利,也比较实用。

category大家肯定都熟(不熟悉的请学好Objective-C基础教程),可以为已有类型创建自己独有的类别,往里面添加自定义的方法来迎合实际需求。
但是,如果想修改已经存在的方法怎么办?
这里说一下两种情况:
1. 完全覆盖,这个好说,继承一下,把接口重写就好了。
2. 部分修改,例如增加自己的处理流程。你肯定讲继承一样可以做到,但是我们千万不能忘记category为什么要存在。

下面就以NSString(大家肯定清楚用继承对这个类进行扩展的弊端吧)举个简单的例子:
1. 目的:
修改UTF8String这个方法,当我们通过这个方法获取C字符串的时候,在源串后面添加"^_^DevDiv"。

2. 实现:
2.1 首先为NSString创建一个类别,定义如下
  1. @interface NSString (NSString_Addition)

  2. + (BOOL)swizze;

  3. @end
复制代码
2.2 实现静态方法swizze,移花接木的本事就在下面的代码里了
  1. + (BOOL)swizze
  2. {
  3.     Method oldMethod = class_getInstanceMethod(self, NSSelectorFromString(@"UTF8String"));
  4.     if (!oldMethod)
  5.     {
  6.         return NO;
  7.     }

  8. 2.3 做我们想做的事情
  9. [code]- (const char *)ovUTF8String
  10. {
  11.     NSLog(@"in:ovUTF8String");
  12.     
  13.     char *sOriginal = (char *)[self ovUTF8String]; // endless recursion?? no.
  14.                                                    // look up the definition of swizze
  15.     int iOrgLen = (NULL == sOriginal ? 0 : strlen(sOriginal));
  16.     
  17.     char *sCustom = (char *)malloc(iOrgLen + strlen(CSTRING_CUSTOM_ADDITON) + 1);
  18.     if (NULL != sCustom)
  19.     {
  20.         NSLog(@"alloc mem for custom string succeed!");
  21.         
  22.         if (NULL != sOriginal)
  23.         {
  24.             strcpy(sCustom, sOriginal);
  25.         }
  26.         
  27.         strcat(sCustom, CSTRING_CUSTOM_ADDITON); // CSTRING_CUSTOM_ADDITON == "^_^DevDiv"
  28.     }
  29.     
  30.     NSLog(@"out:ovUTF8String");
  31.     
  32.     return (const char *)sCustom;
  33. }
复制代码
2.4 测试一下
  1.     if ([NSString swizze])
  2.     {
  3.         NSLog(@"swizze succeed!");
  4.         
  5.         NSString *s1 = @"Hello, everyone";
  6.         
  7.         NSLog(@"original:%@", s1);
  8.         
  9.         char *s2 = (char *)[s1 UTF8String];
  10.         
  11.         NSLog(@"new:%s", s2);
  12.     }
复制代码
2.5 运行结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值