复制方法 IMP 以进行多个方法混合

2024-01-03

我设置了一个类,理想情况下将读取传入的任何类的方法,然后在运行时将它们全部映射到单个选择器,然后将它们转发到原始选择器。

这现在确实有效,但我一次只能使用一种方法。问题似乎是,一旦我调整第一个方法,我用于捕获和转发该方法的 IMP 现在已与其他方法 IMP 交换。任何进一步的尝试都会搞砸,因为他们使用新交换的 IMP 来替换其他 IMP。

1)所以我有MethodA、MethodB和CustomCatchAllMethod。

2)我将方法与 CustomCatchAll 方法交换。方法A->CustomCatchAllMethod、CustomCatchAllMethod->方法

3)现在我尝试用CustomCatchAllMethod交换到MethodB,但是由于CustomCatchAllMethod现在= MethodA,MethodB变成MethodA和MethodA->MethodB。

那么,如何为每个我想要拦截的新选择器获取/复制 IMP 的新实例呢?

这是上述流程的粗略模型:

void swizzle(Class classImCopying, SEL orig){
 SEL new = @selector(catchAll:);
 Method origMethod = class_getInstanceMethod(classImCopying, orig);
 Method newMethod = class_getInstanceMethod(catchAllClass,new);
 method_exchangeImplementations(origMethod, newMethod);
}

//In some method elsewhere

//I want this to make both methodA and methodB point to catchAll:
swizzle(someClass, @selector(methodA:));
swizzle(someClass, @selector(methodB:));

这种常见的方法调配模式仅在您想要拦截一种方法与另一种方法时才有效。在你的情况下,你基本上是在移动实施catchAll:周围而不是到处插入。

为了正确地做到这一点,你必须使用:

IMP imp = method_getImplementation(newMethod);
method_setImplementation(origMethod, imp);

但这给您留下了一个问题:如何转发到原始实现?
这就是原来使用的模式exchangeImplementations for.

在你的情况下,你可以:

  • 保留原始表IMP周围或
  • 使用一些通用前缀重命名原始方法,以便您可以从以下位置构建对它们的调用catchAll:

请注意,当您想通过相同的方法转发所有内容时,只能处理相同数量的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制方法 IMP 以进行多个方法混合 的相关文章

  • 如何在 SQLite 中替换字符串?

    如何更新具有以下内容的表列 var mobile 233KKFSDK3234 Documents Page jpg 并将其替换为 Documents Page jpg 在 SQLite 中 注意 所有文字 除了 Documents 是动态的
  • 无法安装企业应用程序 - 此配置文件无法安装在此设备上

    我正在设置 Jenkins 来构建应用程序的企业版本 以便在我们的内部应用程序商店中分发 如果我将应用程序存档在 Xcode 中 然后在手机上下载内置的 ipa 则应用程序安装不会出现任何问题 但是当我使用 Jenkins 生成的具有相同私
  • 有没有办法阻止 iOS 上的 Safari 在关闭时清除网站的 cookie?

    我的移动网络应用程序的一位用户抱怨说 每次他关闭手机屏幕后使用该应用程序时 他都必须重新登录该应用程序 发生的情况是 当屏幕关闭时 或者当您通过双击主页按钮并滑开 Safari 来完全关闭 Safari 时 Safari 会清除该网站的 C
  • 如何从 iOS 应用程序检测不安全的 wifi 网络

    我想检测我的应用程序中是否存在不安全的 wifi 网络 是否有任何公共 iOS API 可以实现相同的目的 没有记录的 API 可以获取该信息 如果您的应用程序需要通过网络发送和接收敏感数据 您通常应该假设没有安全连接
  • NSOperation 中委托的使用

    我正在尝试利用CLLocationManager in an NSOperation 作为其中的一部分 我需要能够startUpdatingLocation然后等到收到 CLLocation 后才完成操作 目前我已经完成了以下操作 但是委托
  • 在 UITextView 上添加具有自定义间距和文本的图像

    I want to add Image on text view and want proper spacing as shown in screenshot 我尝试在文本视图上添加图像 但在根据要求放置文本时遇到问题 请向我提供有关同样的
  • 为什么没有收到(UDP 多播)数据包?

    所以 我一直试图弄清楚为什么这不起作用 但我没有任何线索 我已经成功地从 iPhone 发送数据包并在 Mac 上接收它们 根据 tcpdump 我的 mac 正确发送数据包 此外 如果我在模拟器中运行它 它工作得很好 这让我相信这是一个网
  • CGContextSelectFont 等效项

    在 iOS 7 CGContext SelectFont 中已弃用 已弃用的消息说我必须使用 Core Text 但我不知道哪一个与这段代码完全相同 CGContextSelectFont context Helvetica kBarLab
  • 无法添加钥匙串项目。使用 KeychainItemWrapper 更改标识符后出现错误 - 25299?

    我想用 KeychainItemWrapper 将 UUID 保存在钥匙串中 所以我在中添加以下方法MyKeychainManager m define keychain idenentify com myapp bundle1 void
  • iOS 解析如何通过 URL 下载文件

    我正在将 parse 用于我的聊天应用程序 当我上传文件时 我保留该 url 并将该 url 发送给其他用户 然后其他用户可以通过该 URL 下载文件 这是我上传文件的代码 void uploadBlob NSData blob fileN
  • 使用 UIKeyCommand 检测删除键

    任何人都知道如何使用检测 删除 键UIKeyCommand在 iOS 7 上 当人们在使用 Swift 时遇到问题时 我认为用 Objective C 和 Swift 编写一个小型的 完整的例子可能是一个很好的答案 请注意 Swift 没有
  • iOS 11 浮动 TableView 标题

    有一个应用程序包含多个部分 展开 时每个部分有几行 折叠 时没有 每个部分都有一个部分标题 使用以下子类重用它们UITableViewHeaderFooterView等等 到目前为止一切顺利 然后在 iOS 11 中 我使用了可视化调试器
  • 除非在后台线程中获取新的引用,否则存在潜在的引用计数问题

    我有一个second https stackoverflow com questions 28898966 prefer property accessor or kvc style for accessing core data prop
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • 你如何在react-native中实现捏合缩放?

    我一直在研究 PanResponder 我当前的工作假设是 我将检测是否有两个触摸正在向外移动 如果是 则增加元素大小onPanResponderMove功能 这似乎是一种混乱的方法 有没有更顺畅的方法呢 如果您只需要简单的捏缩放功能 只需
  • NSDateFormatter:根据 currentLocale 的日期,不包含年份

    这不会太难吧 我想显示不带年份的日期 例如 8 月 2 日 美国 或 02 08 德国 它也必须适用于许多其他语言环境 到目前为止 我唯一的想法是对年份进行正常格式 然后从生成的字符串中删除年份部分 我认为你需要看一下 NSString d
  • ios 11 - UIBarButtonItem 内的 UIButton 导致自动布局错误

    我在将 UIButton 添加到 UIBarButtonItem 时遇到了一个已知问题 我尝试按照建议添加自动布局约束堆栈溢出 https stackoverflow com a 46336639 505603但我收到如下所述的错误 UIB
  • 所有针对 iTunes Connect 的构建,导入此构建时出错 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我将构建上传到应用程序商店 之后它在活动中显示错误 任何人都可以帮帮我 SOLVED 转到构建设置 gt 搜索 bitcode gt 转启
  • 使用 nib 作为带有 nib 类的表节标题

    我想创建一个加载 nib 文件并将其设置为标题 UIView 的节标题 这个 nib 文件还将有一个关联的类 其中插座和操作连接到 因此我想像平常一样使用 nib 加载该类 我在网上搜索并找到了几个类似的答案 但我找不到任何适合我的答案 经
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任

随机推荐

  • ASP.NET MVC 5 中的自定义错误页面

    我想将自定义错误页面添加到我的项目中 我发现这篇关于我的问题的文章 http benfoster io blog aspnet mvc custom error pages我尝试去实现它 So i add 404 cshtml 404 ht
  • 在 R-Markdown 中的网格上显示多个图文

    谈话结束后here https stackoverflow com questions 30509866 for loop over dygraph does not work in r 有没有办法在网格中组织输出的dygraphs 连续显
  • 编辑 XAML 时 Visual Studio 2010 随机崩溃

    在 WPF 应用程序中编辑 XAML 时 Visual Studio 2010 RTM 会随机崩溃 我正在完全更新的 Win 7 上运行它 安装的扩展 插件是 雷夏珀 电源命令 崩溃日志是 错误应用程序名称 devenv exe 版本 10
  • 将函数应用于 pandas 数据框的每一行以创建两个新列

    我有一个熊猫数据框 st包含多列
  • 动态调整 iframe 的高度

    我有一个 iframe 其中包含网站的一些内容 我希望 iframe 调整为 src 内容高度的 100 有点 js 菜鸟 这就是我正在处理的内容
  • 整个应用程序的浮动视图

    我需要对我的所有应用程序有一个浮动视图 我可以使用 Window service 但我不需要我的视图位于应用程序之外 仅在我的应用程序内 我也不希望用户看到 在其他应用程序上绘图 权限 我还能怎样做呢 我不得不做类似的事情 就我而言 我希望
  • 如何检查 Postgres 中是否存在 json 键?

    假设我有一个如下所示的 json some json key a nested key a key b nested key b 注意key a and key b是映射到字典的可选键 可能存在也可能不存在 我有一个函数可以检查外键是否存在
  • 如何使用Homebrew的Ruby包而不是MacOS自带的Ruby包?

    如何从使用 MacOS 附带的 Ruby 版本切换到使用 Homebrew 下载的最新版本的 Ruby 我的 MacOS 版本似乎有ruby 2 3 7p456 2018 03 28 revision 63024 universal x86
  • 在两行以上使用上标时修复图例标题 - R ggplot2

    我正在绘制我的研究区域的地图 但在编辑图例标题时遇到问题 我需要它是 预计 40 年休耕期的水果生产率 水果 ha 1 用四行写成 我可以使用 bquote 将 1 绘制为上标 但它创建了一个我无法提供的额外空间想办法把它去掉 只有当标题被
  • DispatchQueue 同步并发

    好吧 我已经经历了大量的问题和答案 并且我知道对其的理解 但是当我尝试一些代码时 我得到的结果并不支持这些理论 到目前为止我所理解的 同步 一旦块内的所有任务都被执行 控制就会返回 异步 控制将在块被击中后立即返回 这是看起来不错的部分 现
  • Node.js 和 AngularJS 中的 CORS

    我的应用程序存在 CORS 问题 我的堆栈是 Node js快车4 http expressjs com 和 AngularJS 使用矩形 https github com mgonto restangular 我已经尝试过一些事情 例如
  • Java EE 应用服务器 Hello World

    我对独立 Java 应用程序开发相当满意 但很快就会使用 Java EE 应用程序服务器开发一个项目 有谁知道让 hello world 类型的应用程序在应用程序服务器中工作的简单操作教程 我 也许天真地 假设不同框架之间的总体方法是相似的
  • 如何使用 javascript 或 jquery 使图像或按钮在鼠标悬停时发光?

    我想在将鼠标悬停在按钮或图像上时添加发光效果 如何使用 javascript jquery 或 CSS 执行此操作 这是我希望它看起来的示例http www flashuser net flash menus tutorial flash
  • SimpleXML 不断返回 CDATA 元素上的内容

    这是另一个 CDATA 返回内容的问题 我看过很多答案 但即使我尝试了所有答案 我仍然只得到内容 更详细地说 我有一个 xml 文件 里面包含许多 NewsItem
  • 使用 C# 表单应用程序静默安装 SQL Server

    我有一个用 C 开发的 Windows 应用程序 我需要将其安装在仅安装操作系统和 Net Framework 的 PC 上 现在我必须提供一个选项 以便使用此 Windows 应用程序在该 PC 上安装 SQL Server 2008 R
  • 如何在.NET / Sql Server 中在用户当地时间发送电子邮件?

    我正在编写一个程序 需要每小时整点发送一封电子邮件 但时间是用户本地的 假设我有 2 个位于不同时区的用户 约翰在纽约 弗雷德在洛杉矶 服务器在芝加哥 如果我想在本地下午 6 点向每个用户发送电子邮件 我必须在服务器时间下午 7 点向 Jo
  • OKhttp:SSLProtocolException:SSL 握手终止

    我试图找出为什么有时会出现此错误 javax net ssl SSLProtocolException SSL 握手终止 ssl 0x60d46c90 SSL 库失败 通常是协议错误 错误 1409443E SSL 例程 SSL3 READ
  • 如何在Python中计算一周的第一个日期和最后一个日期

    我需要用 python 计算一周的日期 我需要这个 year 2012 week 23 a b func year week print a print b gt gt gt 2012 04 06 gt gt gt 2012 06 10 你
  • Docker-compose 与 nginx 反向、一个网站和一个 Restful api?

    我希望你能帮助我解决我的问题 这是信息 情况 我目前有两个工作容器 需要在同一个端口 80 上运行 有一个网站 目前只需转到服务器的主机 url 即可访问该网站 还有 Restful api 然而 它必须通过端口 80 来工作 并且登录向
  • 复制方法 IMP 以进行多个方法混合

    我设置了一个类 理想情况下将读取传入的任何类的方法 然后在运行时将它们全部映射到单个选择器 然后将它们转发到原始选择器 这现在确实有效 但我一次只能使用一种方法 问题似乎是 一旦我调整第一个方法 我用于捕获和转发该方法的 IMP 现在已与其