【发布时间】:2012-08-01 01:38:33
【问题描述】:
今天我正在做一个项目,我想为NSArray 的所有实例“别名”一个替代方法,并且认为使用一些good old-fashioned method swizzling. 不会太困难
我爆发了JRSwizzle 并且……
[NSArray jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(objectAtIndex_accordingToMe:) error:nil];
为了清楚起见,我将它与 NSArray 上的适当类别配对,这是一个名为 objectAtIndex_accordingToMe: 的实例方法。
但是,我只是在相同的旧索引处获得相同的旧对象。叹。最终,我发现尽管没有抛出任何错误 - 我不会达到这些结果due to the fact that NSArray is a class cluster
我想我的问题更多是不愿意接受“这个”真的是试图覆盖NSArray 方法的尽头。我的意思是,来吧这是NSArray..人们一定想搞砸它,不是吗?有人会认为 Apple 的基础课程将成为各地调酒师的主要目标!
那么,有没有办法改变、别名、monkey-patch、覆盖或以其他方式使用......一个 NSArray 等(没有子类化)?
【问题讨论】:
-
你想完成什么?
-
只是一个想法,但我之前使用过目标 C 运行时来调动代码。在较低级别,您可以获取返回数组的类并直接对其进行调整,而不是尝试使用类别。那么实际的实现类应该无关紧要。
-
@NSResponder 我经常使用
objectAtNormalizedIndex方法,它的作用类似于 NSArray 上的一种循环队列——我想在这里实现它,但不需要对现有代码进行一百万次更改。我以前从来没有为 swizzling 烦恼过,所以我想看看我能不能做到这一点,但我想也许 Apple 似乎讨厌所有与 swizzle 相关的东西(SIMBL 等)是有原因的。 -
混搭基本系统类会导致问题。框架依赖于特定的功能,混合 NSArray 将打破这些假设并导致极其难以重现的错误。即使你能做到,也请不要这样做。
标签: objective-c cocoa nsarray monkeypatching swizzling