问题标签 [method-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 回答
7239 浏览

swift - swift 4中的方法调配

Swizzling 在 Swift 4 中不再起作用。

Method 'initialize()' defines Objective-C class method 'initialize', which is not permitted by Swift

这是我找到的解决方案,因此想将问题和答案留给其他人。

0 投票
1 回答
207 浏览

ios - 如何快速实现类swizzling?

我有一个 view.xib 文件,它有一个小容器(容器视图),其中包含所有控件,如按钮/文本字段,所有控件事件都由父 view.xib 类文件处理。

我的要求是在一个地方我需要添加/显示父级,即 view.xib 完成的屏幕。在另一个地方,我只需要添加容器视图。当我仅添加/显示容器视图时,控件的关联事件/方法不起作用。

所以我想,如果我可以用父view.xib的类来改变容器视图的类,我的工作就可以完成了。

因此,如果可以以这种方式处理,请向我建议一些其他解决方案或类混合。

基本上我在uitableview单元格的容器(视图)上添加容器视图我的代码如下

0 投票
0 回答
99 浏览

ios - 方法调配在模拟器上不起作用

我正在尝试使用以下代码来调整 UIButton 的 init 方法和布局子视图:

在带有选项方法的应用程序委托午餐中,这些方法的混合称为:

辅助函数为:

我正在使用 Xcode 9.0,在真实设备上进行测试时它们似乎运行良好,但是当尝试使用模拟器时,任何 UIButton 的初始化都会使应用程序崩溃。

有谁知道这是 Xcode/Swift 问题还是我的方法有问题?

PS我正在使用Swift 4

0 投票
0 回答
211 浏览

objective-c - NSObject 上的方法 swizzling,不适用于 UIView

另一个方法swizzling 问题,以前没有问过。

我想监控我的应用程序中的所有发布调用,因此我决定在 NSObject 上使用方法调配,以便可以监控所有类。实际代码取自此处,但为了清楚起见,我也会将其附加到此处。

似乎,尽管所有(大多数?)案例都有效,但这不适用于 UIView 及其子项。

我期待的是,即使 UIView 覆盖了这个方法,或者即使对它进行了调配,最终这个方法也会以原始的发布方法结束,因此通过调配我的代码将被执行。

如果我将 swizzling 放在 UIView 类NSObject 类上,那么 swizzling 就完美了。如果我把它放在 NSOBject 上,Swizzling 在 UIResponder 类中也可以正常工作。似乎 UIView 有一些打破链条的自定义实现?

这是我正在使用的代码:

0 投票
1 回答
360 浏览

ios - 如何在目标 c 中动态创建类别?

我正在开发一个objective-c 库项目('MyLib')。假设这个库随后包含在“TestApp”中。现在,“TestApp”还包括另一个名为“Xlib”的库。这个 Xlib 有一个类 C1,它有一个方法 m1。

现在,每次调用 m1 时,MyLib 都应该执行一段代码。我的方法是,如果我在 MyLib 中创建一个类别:

问题: MyLib 没有 C1 类。所以我无法构建 MyLib,因为我试图在一个不存在的类上创建一个类别。因此,编译错误。

所以,然后我尝试将上面的代码包装在里面:

MyLib 现在可以正常编译和构建,但由于 MyLib 中不存在 C1.h,因此 mylib.framework 不会有此类别。

现在,我有两个选择: 1. 动态创建这个类别,这样一旦库被包含在应用程序中,然后当应用程序运行时,将根据TestApp 是否包含Xlib 来创建这个类别。2.从编译源中删除具有此类别代码的文件,然后以某种方式将该文件在我的框架中公开给TestApp。

我无法解决任何一个选项。关于现有选项的任何想法?或任何新的选择?

编辑:添加了详细信息,因为问题不是很清楚

0 投票
0 回答
81 浏览

ios - SDK 中的 Swizzling NSDictionary 初始化程序

所以我计划像其他人一样为 NSDictionary 创建一个安全的初始化函数,但因为我是一名 SDK 开发人员:

  • 我想为它添加一个开关,用户可以决定是否要打开它;

  • 我不想使用 Category 来实现它。

所以我创建了一个名为“ALDictionarySafeFunction.h”的全新类,它有两个功能,第一个是开关功能,如下所示:

ALSwizzlingHelper 可以帮助我调配两个函数。

第二个是安全的初始化函数,像这样:

对于正常情况(在Category中编写swizzled方法),我需要像我写的那样调用原始方法。

但问题是我不能在这里做,因为“self”对象是“__NSPlaceholderDictionary”的实例,而“__NSPlaceholderDictionary”类没有实例方法“safeInitWithObjects:forKeys:count:”。

所以我该怎么做?

有没有办法做到?

任何建议将被认真考虑。

0 投票
1 回答
52 浏览

objective-c - 方法调配在 Objective C 中不起作用

我想在 Objective C 中测试方法 swizzling:

goodName1.添加方法AViewController

2.添加调酒goodName方法的类别。

  1. 如果一切正常,goodName被调用的将输出i am xxx goodName,但它是输出I am a good Name

有什么地方不对吗?谢谢。

0 投票
1 回答
422 浏览

objective-c - 在运行时调配特定类的未知选择器

我的图书馆的一个公共标头中有一个具有以下方法的类。我班级的用户将传入选择器和班级。

在编译时,我不知道选择器会是什么样子,将传递多少个参数等等......但我想要的是能够在运行时调整传递的选择器,执行一些额外的逻辑,然后调用之后的原始方法。

我知道如何调配类和实例方法,但我不确定在这种情况下我将如何进行。

有没有人有处理类似方法的经验?

0 投票
1 回答
216 浏览

objective-c - Objective-C Method Swizzling 会影响其他进程中的代码吗?

Objective-C Method Swizzling 会影响其他进程中的代码吗?

例如,我-[NSArray count]在我的应用程序中使用 swizzling 方法。其他进程中的代码会受到该方法调配的影响吗?

AFAIU 方法解决方案应该在过程中。但我不确定系统框架中的代码。它们是否在进程之间共享自己的方法分辨率,或者它们具有每个进程的方法分辨率

0 投票
0 回答
108 浏览

objective-c - 试图欺骗 macOS 软件在 High Sierra 上运行

所以我有一些软件已经开始停止工作,因为我已经更新到 High Sierra。该软件没有发布新版本,因此我无法获得新的支持版本。

我想要做的是找出显示 10.13.4 不受支持的消息是否确实正确,或者它是否只是开发人员提出的一些任意值。我想这更像是一个 POC/ 游戏。

所以,仅供参考,我是一名 iOS 开发人员,对 Objective-C 和方法混合等概念有相当好的掌握,这可能有助于欺骗版本检查,使其认为操作系统版本是 10.12.x,然后在启动后取消混合。

我知道可以更改 SystemVersion.plist,但由于这需要禁用系统完整性保护,我真的很想尽可能避免这条路线。

任何想法或建议的解决方案将不胜感激。我知道这个系统版本检查可能存在某种合法的功能限制,但我很好奇。