美文网首页runtime
修改实例方法,增加新的实例方法

修改实例方法,增加新的实例方法

作者: 轻云绿原 | 来源:发表于2017-03-27 21:28 被阅读27次

修改实例方法

import Foundation
import UIKit

class Demo:NSObject{
    dynamic func test(msg:String){
        print(msg)
    }
    
    class func test1(msg:String){
        print(msg)
    }
}
let sel = #selector(Demo.test(msg:))

/// 获取test(msg:)的方法
let method:Method = class_getInstanceMethod(Demo.self, sel)
/// 获取方法实现体的指针
let oldIMP:IMP = method_getImplementation(method)

// 把方法体指针转成具体的block
typealias OldBlockType = @convention(c) (Demo,Selector,String)->Void


let oldBlock = unsafeBitCast(oldIMP, to: OldBlockType.self)

// 调用
//oldBlock(Demo(), sel, "调用方法。")

// 参数方法要把类名带上,方法名不用带。带了出错。
let newBlock:@convention(block)(Demo,String)->Void = {(demo,msg) in
    print("before")
    oldBlock(demo, sel, msg)
    print("after")
}
let newIMP = imp_implementationWithBlock(unsafeBitCast(newBlock, to: AnyObject.self))

method_setImplementation(method, newIMP)

Demo().test(msg: "jjj")

//结果
/*
before
jjj
after
*/

增加新的实例方法


import Foundation
import UIKit


class Demo:NSObject{
    dynamic func test(msg:String){
        print(msg)
    }
    
    class func test1(msg:String){
        print(msg)
    }
}

//方法体
typealias NewBlock = @convention(block)(Demo,Selector,String)->Void
let block:NewBlock = { (demo,sel,msg) in
    print(msg)
}

//方法引用 IMP
let imp = imp_implementationWithBlock(unsafeBitCast(block, to: AnyObject.self))

//方法选择器
let sel = Selector(("newFunc"))

//向类里增加方法
class_addMethod(Demo.self, sel, imp, "v@:")
//调用新的方法
Demo().perform(sel,with: "新增加了一个方法。")

/*
 新增加了一个方法。
 */

相关文章

  • 修改实例方法,增加新的实例方法

    修改实例方法 增加新的实例方法

  • Model方法

    基本方法 查找 增加 修改: 删除 一个实例

  • Swift3.0-实例方法

    实例方法 实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供访问和修改实例属性的方法或提供与实例...

  • Swift5.1方法&下标

    11.方法 实例方法//实例方法是属于某个特定类、结构体或者枚举类型实例的⽅法。实例方法提供访问和修改实例 属性的...

  • Swift基础-12(方法)

    1.实例方法 实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供访问和修改实例属性的方法或提供与...

  • 为类、结构体以及枚举添加方法

    实例方法 实例方法是属于特定类实例、结构体实例或者枚举实例的函数。他们为这些实例提供功能性,要么通过提供访问和修改...

  • 方法 下标 继承

    方法 在类型方法中 不能直接修改实例属性 mutating 默认情况下 值类型的属性不能被自身的实例方法修改 di...

  • Python Day107(类:修改属性的值)

    三种方法修改属性的值: 1、直接通过实例进行修改;2、通过方法进行设置;3、通过方法进行递增(增加特定的值)。 1...

  • 第十九节 Swift中的拓展

    扩展用来给已有的类、结构体和协议增加新功能: 添加计算实例属性和计算类型属性; 定义实例方法和类型方法; 提供新初...

  • python学习疑惑

    静态方法,类方法,实例方法区别 1.调用方式不同2.类方法默认有cls属性,可以修改本类的属性值,实例方法有sel...

网友评论

    本文标题:修改实例方法,增加新的实例方法

    本文链接:https://www.haomeiwen.com/subject/qccdottx.html