问题标签 [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.
ios - 类别+加载时间问题
我有一个类层次结构如下
我想为这些在协议中定义并在类别中实现的类添加特定于平台的扩展:
的基本实现-foo:
在 PTLDatasource 类别中完成。但是,我还需要 PTLFetchedDatasource 的自定义实现,-foo:
然后可以回退到 PTLDatasource 实现。
目前我正在尝试在PTLFetchedDatasource (TableViewExtensions)
in 中调配实现+load
,但我遇到了在+load
inPTLFetchedDatasource (TableViewExtensions)
之前调用+load
in 的问题PTLDatasource (TableViewExtensions)
,因此调配失败,因为 PTLDatasource 的实现-foo:
尚不存在。
有没有办法解决这个加载时间问题?
我还需要调酒吗?我知道在一个类别中覆盖类成员方法是不行的,但是我可以[super foo:]
从PTLFetchedDatasource (TableViewExtensions)
实现中调用吗?
谢谢。
ios - 如何调配 AudioSessionAddPropertyListener
我的项目中有一个库正在添加音频属性侦听器。我真的需要能够阻止它这样做,但我没有源代码。
我之前对 NSNotificationCenter 中的 addObserver 方法进行了调整。你能帮我为 AudioSessionAddPropertyListener 做同样的事情吗?如果尝试在调用中添加的方法与我的白名单不匹配,我想阻止它。否则,我将调用原始方法。
我不知道应该为哪个类重载加载函数。我正在查看 Audio.h 的内部。我正在添加一些伪/真实/badlyNamed 代码,以便您可以看到我正在尝试做什么。
objective-c - 我可以调整 UITableViewDelegate 的 didSelectRowAtIndexPath: 吗?
问题是这样的:
我需要能够在具有大量 tableViews 的大型现有应用程序中对 didSelectRowAtIndexPath 进行分析。
我的第一个想法是在 didSelectRowAtIndexPath 上进行方法调配:但是我的应用程序崩溃并显示“无法识别的选择器发送到实例”消息,具体取决于在原始 didSelectRowAtIndexPath 实现中访问的内容。
这是我尝试在 UIViewController 类别中实现此目的的方法:
这可以实现吗?如果是这样,我做错了什么?
谢谢!
objective-c - 以编程方式创建新的实例方法来跟踪消息发送
我想设计一个类 ( TrackingClass
),它负责跟踪对另一个类 ( TrackedClass
) 的某些方法的调用,即根据我的理解设置方法。
假设我用我感兴趣@selectors
的实例方法加载了一个数组TrackedClass
。这是我想运行的伪代码:
和
从理论上讲,我只是缺少可以有效创建这个新实例方法的代码trackedSelector
。我能做到吗?
编辑
我用一些新信息更新了代码,我越来越近了吗?
编辑 2
如果人们想动态地尝试他们的想法,我会建立一个带有演示应用程序的 Github 存储库。资料来源:Github 上的 BCTrackingClass
编辑 3
我终于想出了代码的工作版本(参见 Github repo,或以上)。我的下一个问题是:我希望我的类是基于实例的(目前,我所有的方法都是类方法),这样我就可以为@property NSMutableDictionnary*
类的实例分配一个属性以进行调用记录。我不确定如何实现这一目标。有什么想法吗?
objective-c - 方法混合的线程安全
方法 swizzling 用于以下单例初始化程序,但我不确定 swizzling 的线程安全性。
当一个线程即将调用一个即将被另一个方法调动的方法时会发生什么?在有线程要调用该方法的情况下,随时进行调配是否安全?请用官方参考回答。谢谢
ios7 - Swizzling NSBundle 用于可重新设计的演示
我正在尝试构建一个可以通过下载包含图像和字符串文件的捆绑包来重新设计的应用程序(不适用于应用商店分发)。
对于本地化,我在localizedStringForKey:value:table:
加载自定义字符串时没有遇到任何问题,但是对于图像我有更多的麻烦。
我的项目正在使用没有资产目录的情节提要并针对 iOS 7。我尝试在 NSBundle 上调整以下方法来捕获从情节提要中加载的图像,但没有一个被命中(至少对于 png 文件):
我确实看到了加载文件的尝试.car
(这是资产目录格式)但是这些返回一个nil
URL。我也尝试过pathForResource:
调整上述方法的版本,但没有捕获到新的调用。
有任何想法吗?
ios - 你可以调整应用程序:didReceiveRemoteNotification:
我目前正在开发一种需要调整 AppDelegate 应用程序的产品:didReceiveRemoteNotification:(我不想在 appDelegate 本身中调用我的新方法)。
问题是:调酒根本行不通。我之前已经成功地调配了好几次方法,而这一次,替换实现根本没有被调用。我想知道这是否是因为 appDelegate 方法的某些特殊性,因为这些方法是由系统调用的,而不是由应用程序调用的。
ios - 使用 Delphi XE5 在 UIView 类 [Swizzling] 中进行 Hook touchesBegan
我正在尝试在全球范围内捕获所有触摸事件。为此,我知道我可以在 UIView 类中挂钩触摸事件过程。我有编译的代码。我的钩子实现是
然后我尝试用两种不同的方式来连接它。第一的:
这似乎是标准方法。第二个:
据我了解,这也应该有效。我得到了“ touchesBegan:withEvent ”的实例,并且所有代码都执行没有错误。但是当我然后触摸模拟器屏幕时,代码在单元“ Macapi.ObjectiveC.pas ”中的“ DispatchToImportSuper ”内崩溃。我显然做错了什么,但我不知道是什么。如果这可行,就可以在不修改 Delphi 源代码的情况下监听触摸事件。
有人有什么想法吗?
objective-c - 为什么 UIAlertView 的 alloc 方法的这种混搭会导致递归?
我正在玩调酒,但不太明白这一点。我的 alloc swizzle 看起来像这样:
如果我在重复调用的 NSLog 语句处暂停,在调用堆栈中我会看到:
似乎 timeZoneWithName: 正在回调我的自定义 alloc 方法。显然,当 alloc 没有被混合时没有递归,但我很困惑这里发生了什么。
ios - 如何调配私有类的方法
我有一个私有类(都在.m 中声明和定义)作为对不同类的实现的补充,它恰好在内部使用该私有类。
我想调配那个私有类的方法之一。
我定义了一个类别并照常进行:
问题是我的实现显然对这个私有类一无所知,而 self 指的是我要添加类别的类,无论可能是哪个类。所以我无法调用原始实现并且通常使用私有类。
解决这个问题的正确方法是什么?