问题标签 [swizzling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
239 浏览

objective-c - 我应该如何用 Objective-C 中的子类替换系统中类的实例?

我对系统类(具体来说是 UINavigationBar)进行了子类化,以添加一些特定的功能。我一直在到处使用它,作为 UINavigationBar 的替代品。但是,现在我想用我的自定义子类替换系统框架中使用的一些 UINavigationBar,因此它们提供相同的行为。具体来说,我希望 UITabBarController 的更多视图控制器中的 UINavigationBar 成为我的类的实例。

我认为这可能是不可能的,所以我尝试在 UINavigationBar 上创建一个类别,该类别会在系统的任何地方传播。但是,我的类别需要进行一些自定义初始化和拆卸(订阅和取消订阅 NSNotificationCenter 的通知)。如果我覆盖我的类别中的 init/dealloc 方法,我将无法调用原始方法(由 UINavigationBar 实现),这可能非常危险/致命/可能不是很实用。

一种可能的解决方案是方法调配,但我不太确定如何使用它,而且它显然可能相当复杂。

如果有人能够详细说明如何实现一些可以解决我的问题的东西(或者一些关于如何使用方法调配的自定义代码),我将不胜感激。

0 投票
3 回答
216 浏览

objective-c - 用内存地址替换方法

我想知道是否有任何方法可以通过内存地址调整方法。例如:我有一个指向方法 0xFFFFFF 的指针。我的应用程序中有一个方法。我想用 my 方法替换指针。有没有办法可以在 Objective-C 中替换这个指针。谢谢。

0 投票
1 回答
509 浏览

swizzling - Method Swizzle Crash:越南语键盘故障和崩溃

编辑:用“Method Swizzle Crash”为问题添加前缀,以帮助其他人找到错误。

对于在模拟器或任何运行 iOS 4 或更高版本的设备上的越南语键盘上按下的每个键,控制台都会打印以下消息,并且不会向第一响应者发送任何字符:

我的服务器或客户端代码中没有这些字符串或子字符串的实例。这来自 API。

运行 iOS 4 的模拟器和设备将在第二次按键时持续崩溃。iOS 5 上没有崩溃。调用堆栈顶部的错误如下所示:

调用堆栈如下所示:

我已经在整个应用程序的多个位置尝试过这个键盘,包括在加载主视图之前的安全屏幕上,并且我们所有的输入处理方法都在它的委托中注释掉了。失败是一致的。当实现委托方法并且我逐步执行 textField:shouldChangeCharactersInRange:replacementString: 时,收到的字符串是有效的。

一切似乎都表明这是一个 Apple 问题,但我没有在网上找到有关该问题的其他报告。我的直觉说这是我的代码中的东西。任何人都可以提供提示吗?

0 投票
1 回答
1426 浏览

c++ - 尝试使用 C++ 将着色器应用于 OpenGL 中的顶点数组的问题

我有 4 维顶点(X,Y,A,B),我想将其绘制为 6 个单独的 2D 图(XxY,XxA,XxB,YxA,...)

我的顶点定义如下:

我可以通过以下方式绘制二维图的第一个 (X,Y):

为了绘制其他 2D 图(XxA、AxB 等...),我决定使用着色器来调整顶点的 X、Y、Z、W 尺寸,具体取决于我要绘制的尺寸。:

我已成功加载、编译、将着色器添加到程序并链接程序。

现在我有了着色器程序,它不清楚如何使用该程序,这会影响我的顶点数组的绘制方式。我尝试了以下方法,但它似乎没有任何效果,因为它绘制的东西与没有着色器的情况完全相同:

是否有一些我遗漏或无法正确理解的基本内容?

编辑 2:我根据 Christian 的建议更新了着色器代码。我还验证了阴影加载时没有错误,但是如果我在调用 glUseProgram 后检查 OpenGl 错误,我会收到OpenGL Error: invalid operation错误消息。

编辑 3:这是最终的着色器:

0 投票
1 回答
612 浏览

ios - 在 IOS 上打乱低级 TCP 方法

我正在尝试找到一种方法来获取有关进出我的 IOS 应用程序的所有 TCP 流量的信息。该应用程序非常简单,由单个 UIWebView 对象组成。

我尝试在 NSURLRequest 上使用 swizzling,但运气不佳 - 我的 requestWithURL: 版本在我手动调用 NSURLRequest 时被调用,但在进入 UIWebView 中的页面时似乎从未被调用,所以我猜它在封面下使用了不同的对象。

所以我想尝试挂钩 CFSocket 函数,但这些不是类的一部分,所以我不确定如何调配它们(或者如果它甚至可能的话)。

有什么方法可以连接到 IOS 上的 C 函数,或者我可以尝试调配以访问 TCP(甚至 HTTP)流量的任何其他 API?

我还尝试使用 NSURLCache,它适用于大多数主要的 .html 页面,但是很多人发现了 .cs 文件,而其他一些人似乎没有通过缓存。

谢谢!

0 投票
4 回答
165 浏览

iphone - Iphone:使用反射替换函数

我有一个要重写的小函数,因此该函数对每个类都有效。目前我有 10 个相同的功能,它们都工作相同,但每个功能都用于另一个类。我知道,我必须通过反射来做到这一点,但我不太确定该怎么做。我已经阅读了这个链接:http: //developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

我正在谈论的功能是:

MissionSectionList 和 DamageAccountList 都是来自两个不同类的 NSMutableArrays。是否可以查看一个类是否包含 NSMutableArray,如果是,那么它应该调用 ....modelObject.MyMutableArray?

0 投票
1 回答
1917 浏览

objective-c - -[CALayer drawInContext:] 有什么作用吗?

根据文档 默认实现什么都不做。

但是......我从 drawRect 方法抛出异常,我看到下一个调用堆栈

据我所知,这意味着 -[CALayer drawInContext:] 调用委托方法的默认实现。这是对的吗?因为我知道调酒技术,所以我不确定 Objective-C 中的任何内容......

0 投票
1 回答
723 浏览

iphone - 是 - [UIView (MyOwnCategory) drawRect:] 从未在 3.1.3 上调用过吗?

我定义了自己的 drawRect 方法,并成功地在 4.2.1 (iOS) 5.0 (iOS) 和 4.3.2 (Simulator) 上调用。但它从未调用 3.1.3 (iPhone 2g)。

这可能是什么原因?

PS自从我开始写问题以来,我认为我的3.1.3设备已越狱。也许这是这种奇怪行为的根本原因。

更新:要重现问题,我使用下一个代码:

即使我[super drawRect: rect]明确调用,3.1.3 也从未发生异常

0 投票
2 回答
5072 浏览

objective-c - App Store - Method Swizzling 合法性

App Store 上是否有任何关于方法调配是否合法/非法的最新信息?

我能找到的唯一数据点是前一段时间对Three20 框架的改组,它从这个通知开始:

您当前发布到 App Store 的应用程序 xxx 正在使用 method_exchangeImplementations 将 Apple 提供的 API 的实现与您自己的实现进行交换。由于即将发生的更改,您的应用程序中的这种行为可能会导致崩溃或导致 iPhone OS 4.0 上的用户数据丢失。

xxx 使用 method_exchangeImplementations 将 dealloc 的实现与您的方法 ttdealloc 交换。它还将方法 popViewControllerAnimated: 的实现与您的方法 popViewControllerAnimated2: 交换。

请立即解决此问题并将您的新二进制文件上传到 iTunes Connect。如果我们认为这样做是谨慎或必要的,我们可能会删除您的申请。


当我四处寻找时,我能找到的每一个关于 swizzling 和应用商店的最近对话似乎都引用了相同的 Three20 事件。该通知似乎非常具体,我想知道问题是否是 Three20 所做更改的特定更改问题,或者 method_exchangeImplementations 是否被普遍禁止。

关于是否允许这种做法,还有其他数据点吗?商店中是否有使用 swizzling 的应用程序开发人员?

谢谢!

0 投票
2 回答
1236 浏览

objective-c - 为多个方法混合复制方法 IMP

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

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

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

2)我用 CustomCatchAllMEthod 交换 MethodA。MethodA->CustomCatchAllMethod、CustomCatchAllMethod->MethodA

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

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

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