zoukankan      html  css  js  c++  java
  • IOS 开发之 Method Swizzling + Category

     

    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.

     

  • 相关阅读:
    backgroudWork使用案例
    UAP单据不能设定【分割】符行使权限管理
    此博客所有内容仅供个人学习使用
    十大排序算法——实现程序
    Linux基础(更新ing......
    树莓派基于tensorflow的数字识别
    树莓派系统初始化配置
    树莓派初始配置步骤(无图版)
    PC、虚拟机Ubuntu和开发板实现三者互ping,可挂载nfs传输文件
    Linux目录结构
  • 原文地址:https://www.cnblogs.com/chen1987lei/p/4867829.html
Copyright © 2011-2022 走看看