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

修改实例方法

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: "新增加了一个方法。")

/*
 新增加了一个方法。
 */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,635评论 19 139
  • 遗留代码 其他人那儿得来的代码; 错综复杂,难以理清的结构,需要改变然而实际上又根本不能理解的代码; 没有编写相应...
    贾尼阅读 3,562评论 1 6
  • Swift语法基础(五)-- (类和结构体、属性、方法) 本章将会介绍 类和结构体对比结构体和枚举是值类型类是引用...
    寒桥阅读 1,183评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,740评论 18 399
  • 我自小孤独,不太会与人一起玩,年龄越大这样的现象愈明显,从两年级下半学期就开始看书,刚开始看一些有插画童话书。《铁...
    沐子2阅读 2,775评论 0 0

友情链接更多精彩内容