今天我正在做一个项目,我想为所有NSArray
实例"别名"一种替代方法,并且不认为使用一些好的老式方法进行旋转会太困难。
我爆发了JRSwizzle和...
[NSArray jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(objectAtIndex_accordingToMe:) error:nil];
为了清楚起见,我将其与 NSArray
上的相应类别配对,一个名为 objectAtIndex_accordingToMe:
的实例方法。
但是,我只是在相同的旧索引中得到了相同的旧对象。 叹息。最终,我发现尽管没有抛出任何错误 - 由于NSArray
是一个类集群,我不会实现这些结果
我想我的问题更多的是不愿意接受"这"实际上是试图推翻NSArray
方法的尽头。 我的意思是,来吧,这NSArray
.人们一定想用它胡闹,不是吗? 有人会认为苹果的基础课程将成为各地旋转者的主要目标!
那么,有没有办法改变、别名、猴子补丁、覆盖或以其他方式使用......一个 NSArray 等(没有子类(?
这不仅仅是一个类集群。 NSArray
是免费桥接CFArray
,你不能刷卡核心基金会。所以这在一般情况下不太可能奏效。
但是你想解决什么?如果要添加新方法,请使用类别。它们在类集群上工作得很好。修改NSArray上某些内置功能的行为似乎是灾难的秘诀(尽管它可能是一种练习,但很有趣(。
在走得太远之前,您可能至少想看一下CFArray.c并了解一些底层内容是如何实现的。
编辑:虽然我永远不会在生产代码中这样做,但您可以通过使用 ISA 重排劫持单个阵列实例来获得一些您想要的东西。有关一些示例代码,请参阅 ISASwizzle。代码解释在 iOS:PTL 的第 20 章中。搜索"isa swizzle",你应该在网上找到更多。这就是 KVO 的实现方式。但是有了NSArray...哇,那一定很脆弱。
大概你有一个特定的数组,你想要这种行为。你可以获取该实例的类对象,不管它是什么,并且很容易地旋转它:
[[myArray class] jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(objectAtIndex_accordingToMe:) error:nil];
NSArray
也只有几个具体的子类:
NSArray * trees = [NSArray array];
NSArray * birds = [NSArray arrayWithObjects:@"Albatross", @"Budgerigar", @"Cardinal", nil];
NSMutableArray * dogs = [NSMutableArray arrayWithObjects:@"Airedale", @"Beagle", @"Collie", nil];
NSLog(@"%@ %@ %@", [trees class], [birds class], [dogs class]);
前两个我们得到__NSArrayI
,第三个__NSArrayM
,所以潜在地(这是非常脆弱的(你可以使用运行时函数按名称获取类对象:
[objc_getClass("__NSArrayI") jr_swizzleMethod:@selector(objectAtIndex:) withMethod:@selector(objectAtIndex_accordingToMe:) error:nil];