如何实现方法调配?

2023-11-23

我正在尝试使用 SIMBL 修改程序的行为(我没有它的源代码)。我使用类转储并发现我需要覆盖实例方法

该方法位于称为控制器的类中。我需要做的就是获取参数 arg1 就这样了。也许 NSLog 或发布通知...... 我读到了 Objective-C 中的方法混合,但我该如何使用它?我需要参考我没有课程的 MessageController 类。

Thanks!


我猜你需要在完成 NSLog 之后调用原始实现;如果没有,您也许可以只使用类上的类别来覆盖该方法。

要调整该方法,首先您需要一个替换方法。我通常将这样的内容放在目标类的类别中:

- (void)replacementReceiveMessage:(const struct BInstantMessage *)arg1 {
    NSLog(@"arg1 is %@", arg1);
    [self replacementReceiveMessage:arg1];
}

看起来它会递归地调用自身,但它不会,因为我们要交换一些东西,所以调用ReceiveMessage: calls this调用时的方法replacementReceiveMessage:调用旧版本。

第二步是使用运行时函数来实际执行交换。使用类别的优点是您可以使用load在类别中进行工作:

+ (void)load {
    SEL originalSelector = @selector(ReceiveMessage:);
    SEL overrideSelector = @selector(replacementReceiveMessage:);
    Method originalMethod = class_getInstanceMethod(self, originalSelector);
    Method overrideMethod = class_getInstanceMethod(self, overrideSelector);
    if (class_addMethod(self, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
            class_replaceMethod(self, overrideSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
    } else {
            method_exchangeImplementations(originalMethod, overrideMethod);
    }
}

有两种情况需要处理:

  • 如果我们正在调配的方法实际上是在超类中定义的,那么我们必须使用class_addMethod添加一个实现ReceiveMessage:到目标类,我们使用替换实现来完成此操作。然后我们可以使用class_replaceMethod取代replacementReceiveMessage:有了超类的实现,所以我们的新版本将能够正确调用旧版本。
  • 如果该方法是在目标类中定义的,class_addMethod会失败,但我们可以使用method_exchangeImplementations只需交换新旧版本即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现方法调配? 的相关文章

  • 从 Xcode 更改按钮文本?

    我有一个 IBAction 连接到 Interface Builder 中的一个按钮 是否可以在运行时从我的代码中更改按钮 在 IB 中 上的文本 如果您的代码中有一个连接到某个操作的按钮 则无需实例变量即可更改标题 例如 如果按钮设置为以
  • 如何在pop UIViewController中删除UIParallaxDimmingView?

    我有一个UIViewController vc1这是在之后推送的UIViewController vc2 Both vc1 and vc2具有透明背景 问题 当我尝试弹出时vc2使用交互式弹出手势 从边缘平移 在我看来堆栈显得很神秘UIPa
  • 使用UDID创建唯一的用户身份

    我正在开发一个 iPhone 应用程序 它与服务器通信以存储和交换数据 因为我想让它尽可能简单 所以我想避免用户帐户的注册 或者也可能使用密码 是否有可能 并且允许 获取 iPhone 设备的 UDID 并制作例如 它的 MD5 哈希值 我
  • 从 iPhone 设备查找当前国家/地区

    我必须在 iPhone 设置中获取当前国家 地区 谁能告诉我如何在 iPhone 应用程序中获取当前国家 地区 我必须使用当前国家 地区来解析需要传递当前国家 地区的 RSS 提要 请帮我找到那个国家 提前致谢 要查找用户选择的语言所在的国
  • 获得 IAP 产品响应后出现 Objective-C 错误

    此代码来自 Phonegap 代码 IAP 插件 错误发生在 发送的js 之后的代码行上 除了最后一个 nil 之外 发送到该函数的所有元素均非零 我什至将它们注销以确保它们已发送 该代码直接来自插件 https github com us
  • 如何使用自动布局在自定义 UITableViewCell 内动态设置 UITextView 高度

    I have UITableView every tableViewCell is custom Inside my customTableViewCell is a UITextView TextViews frame is pin or
  • 子视图的子层与更高的子视图重叠

    我有一个问题 我正在创建一个UIView这是从方法返回的 这部分很好 但我注意到 当我将子层添加到其中一个子视图时 这些层与子层添加的层次结构中较高的子视图 textView 和 imageView 重叠到testViewCopy出现在这些
  • UIView 和 UITableView 中的 UITapGestureRecognizer 冲突

    我有一个UIView我在其中添加了一个UITapGestureRecognizer 在该视图中 我还有一个子视图 其中基本上是某种UITableView 问题是为什么不UITableView识别连续点击 而是始终转到点击手势识别器的处理程序
  • 如何从 Xcode 4 中的实体创建用户界面?

    我已经用核心数据进行了几天的实验 并且在过去的几个小时里尝试找出如何从 xcode 4 中的实体创建 UI 根据我一直在阅读的书籍 您必须选择将核心数据实体拖到界面生成器中的窗口中 但是当我在 xcode 4 中执行此操作时 没有任何反应
  • 在后台每 X 分钟执行一次函数不起作用

    我使用此代码每 X 分钟执行一次函数 void executeEveryOneMinute self myFunction dispatch after dispatch time DISPATCH TIME NOW int64 t 60
  • 返回一个dispatch_async获取的变量[重复]

    这个问题在这里已经有答案了 基本上 一个方法需要返回一个在dispatch async中获取的NSDictionary 这是我尝试过的 NSDictionary fetchNSDictionary dispatch queue t Queu
  • 获取本周的第一天和最后一天

    如何获取本周的第一天和最后一天 我需要的是某种方法来过滤一组具有 NSDate 属性的对象 只留下本周出现的对象 然后按天过滤它们 我还需要一些方法来获取本地化的日期名称 我尝试使用 NSCalendar NSDate 和 NSDateCo
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • Objective-C 使用字符串池吗?

    我知道Java https stackoverflow com questions 3801343 what is string pool in java and C http msdn microsoft com en us librar
  • 检查系统时间是自动还是用户设置

    我需要在当前的项目中设置用户证明时间 我围绕这个问题发现了很多不同的问题 但似乎没有一个问题有我正在寻找的答案 这些是我到目前为止看过的问题 XCODE 如何从设备获取 验证准确的时间戳 https stackoverflow com qu
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • UITextView:内存使用量巨大

    我在 UITextView 中遇到了内存使用过多的问题 我正在将 50Kb ascii 文本文件加载到 NSString 中 并将其分配给应用程序中空 UITextView 组件的 text 属性 这立即使我的内存占用量增加了 100Mb
  • 为每行 NSTableView 文本着色

    我有一个 NSTableView 它显示我拥有的对象数组 对于每个对象 行 我想根据在每个对象上运行的函数的结果来更改显示的文本的颜色 因此 例如表中存在于另一个列表 或其他一些要求 中的所有对象 我想以绿色文本显示它们 不存在的对象以红色
  • 如何将unix时间戳转换为iphone中的nsdate [重复]

    这个问题在这里已经有答案了 可能的重复 从 Unix 时间戳创建 NSDate https stackoverflow com questions 5827240 create nsdate from unix timestamp 我有一个
  • iOS 使用 NSColor 与 UIColor?

    有什么区别UIColor and NSColor 什么时候会使用每一种 我碰到NSColor在试图弄清楚的同时UIColor用于 iOS 中的属性字符串 我理解使用UIColor对于 UIKit 等 但我不认为NSColor对于这种事情确实

随机推荐

  • 是否可以在 Visual Studio 调试会话之间保留 Cookie

    我有一个身份验证 cookie 当我在本地环境中点击登录屏幕后 该 cookie 就会被设置 该 cookie 已被设置为持久性的 并被赋予未来 7 天的超时期限 当我结束调试会话并在另一个构建后开始调试时 cookie 不存在 每个浏览器
  • jquery 获取加载时 iframe 内容的高度

    我有一个帮助页面 help php 我正在 main php 的 iframe 中加载该页面 在 iframe 中加载此页面后 如何获取该页面的高度 我问这个是因为我无法将 iframe 的高度设置为 100 或自动 这就是为什么我认为我需
  • C++ 中的除法[重复]

    这个问题在这里已经有答案了 我是 C 新手 我尝试了这个简单的代码 include
  • 如何将数组作为参数传递给 vararg 函数?

    我有一些代码看起来像这样 uint8 t activities 8 uint8 t numActivities 0 activities numActivities someValue activities numActivities so
  • 将 Dropbox 集成到 Android 应用程序中,但没有登录弹出窗口

    我想在我的应用程序中使用保管箱 我开发了一个用于上传和下载文件的示例应用程序 它要求身份验证 但我不想打开登录弹出窗口 其他用户是否可以使用默认帐户 单个帐户 登录详细信息访问保管箱 因此任何用户都可以直接使用 dropbox 而无需弹出登
  • 可以在 Visual Studio 中使用 WSDL 自动生成代码

    您好 我想使用测试以下功能 http msrmaps com terraservice2 asmx op ConvertLonLatPtToNearestPlace 是否有一些更快的方法可以使用 Visual Studio 2010 对其进
  • 部分匹配行名时发出警告

    我刚刚发现了数据框中行名称部分匹配导致的错误 有没有办法禁用部分匹配 运算符或在使用全局匹配时生成警告 我知道这是可能的exact TRUE为了 运算符或与options warnPartialMatchDollar TRUE for 索引
  • 派生类的指针可以类型转换为其基类的指针吗?

    new 返回的派生类的指针可以进行 类型转换为其基类的指针 这是对还是错 我知道dynamic cast可以用来消除缺点 一般来说 如何将派生类的指针转换为其基类的指针 是的 从指向派生类的指针到指向基类的指针的转换是隐式的 因此 以下内容
  • JUnit - 如何测试具有不同值的方法?

    我有一个方法并希望用不同的值来测试它 我的问题是 如何编写 JUnit 测试来测试具有不同值的相同方法 您可以查看参数化测试 例如example 你也可以使用理论这在很多情况下更方便
  • Android 中使用 Kotlin 的 HTTP 请求

    我想使用 POST 方法进行登录验证并使用 GET 方法获取一些信息 我已经有了我之前项目的 URL 服务器用户名和密码 对于安卓系统 Volley是一个很好的起点 对于所有平台 您可能还想查看ktor客户或http4k这都是很好的图书馆
  • React Admin 显示非常混乱

    我的 RA 项目在本地部署时渲染良好 但是 当我将构建目录复制到 S3 存储桶进行部署时 它渲染得一团糟 有时它会起作用 但大多数时候它会呈现如下图所示 它在使用 AOR 的两种环境中都可以正常工作 环境 React admin版本 2 0
  • 使用 JavaScript 更改浏览器中的 URL,而不加载新页面

    我怎样才能有一个JavaScript可能会对当前页面产生一些影响 但也会更改浏览器中的 URL 的操作 因此如果用户点击重新加载或添加书签 则会使用新的 URL 如果后退按钮能够重新加载原始 URL 那就太好了 我正在尝试在 URL 中记录
  • Pylint 忽略特定名称[重复]

    这个问题在这里已经有答案了 我有 pylint 问题 即有时它会对某些变量 类 模块等重复相同的消息 但我找不到解决方法 我想说的是 pylint 不要使用某些选项或 rcfile 指令检查 此模块 模块 ZZZ 中的 消息 XXX 任何消
  • 有关如何将 SwipeRefreshLayout 与 ListView 结合使用的简单示例

    有人有关于如何将 SwipeRefreshLayout 与 ListView 一起使用的简单示例吗 这是我的情况 我有一个类 SynchDogs 从服务器提取数据 所以该类作为我的适配器的源 我想使用 SwipeRefreshLayout
  • -viewDidLoad 未在子类 UIViewController 中调用

    请耐心等待 我还在学习 Cocoa Touch 其他 viewDidLoad 未被调用问题与我的问题无关 我进行了搜索 I have FooViewController a UIViewController子类 FooViewControl
  • Web API 和 MVC 异常处理

    我们目前正在将 Web 表单系统重新开发为 Web API 和 MVC 这对我们来说是新技术 到目前为止 一切似乎都很好 但是我们正在努力将错误从 Web API 应用程序发送回 MVC 应用程序 我们意识到我们需要捕获任何异常并将这些异常
  • 在 pandas DataFrame/Series 中快速选择时间间隔

    我的问题是我想过滤 DataFrame 以仅包含间隔内的时间 开始 结束 如果不关心这一天 我只想过滤每天的开始和结束时间 我有一个解决方案 但速度很慢 所以我的问题是是否有一种更快的方法来进行基于时间的过滤 Example import
  • TestNG 使用多个 DataProvider 和单个测试方法

    我一直在寻找一种在我的测试方法中使用多个 DataProvider 的方法 我的场景如下 假设我们有一个 DataProvider 类 Test public class ExampleDataProvider Returns the li
  • 通过解释器突变混淆 python 字节码

    事实上 Dropbox 做得非常好 他们能够保护用 python 制作的桌面应用程序 我对此进行了很多研究 但没有比混淆更好的解决方案 这不是很安全的方法 您最终会看到您的代码上传到某个地方 我听了一个会议乔瓦尼 巴霍 PyInstalle
  • 如何实现方法调配?

    我正在尝试使用 SIMBL 修改程序的行为 我没有它的源代码 我使用类转储并发现我需要覆盖实例方法 该方法位于称为控制器的类中 我需要做的就是获取参数 arg1 就这样了 也许 NSLog 或发布通知 我读到了 Objective C 中的