我想使用方法交换,但无法让简单的示例代码正常运行。我可能误解了这个概念,但据我所知,它允许交换方法的实现。
给定两种方法A和B,我想交换它们的实现,以便调用A会执行B。我找到了一些关于交换方法的例子(example1 和 example2)。我创建了一个新项目并添加了一个类来测试它。
预期输出是"B",但仍然打印出"A"。从我的代码可以看出,在交换操作之前和之后,我都包含了每个
输出:
给定两种方法A和B,我想交换它们的实现,以便调用A会执行B。我找到了一些关于交换方法的例子(example1 和 example2)。我创建了一个新项目并添加了一个类来测试它。
class Swizzle: NSObject
{
func method()
{
print("A");
}
}
extension Swizzle
{
override class func initialize()
{
struct Static
{
static var token: dispatch_once_t = 0;
}
// make sure this isn't a subclass
if (self !== Swizzle.self)
{
return;
}
dispatch_once(&Static.token)
{
let originalSelector = Selector("method");
let swizzledSelector = Selector("methodExt");
let originalMethod = class_getInstanceMethod(self, originalSelector);
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector);
print(method_getImplementation(originalMethod));
print(method_getImplementation(swizzledMethod));
let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
if didAddMethod
{
class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
}
else
{
method_exchangeImplementations(originalMethod, swizzledMethod);
}
print(method_getImplementation(originalMethod));
print(method_getImplementation(swizzledMethod));
}
}
func methodExt()
{
print("B");
}
}
然后我尝试使用以下方式执行它:
var s = Swizzle();
s.method();
预期输出是"B",但仍然打印出"A"。从我的代码可以看出,在交换操作之前和之后,我都包含了每个
IMP
的打印。这些打印显示交换确实发生了,但输出仍然相同。输出:
0x000000010251a920
0x000000010251ad40
0x000000010251ad40
0x000000010251a920
A
在实施这些更改时,我是否遗漏了任何内容?
PS. 目前使用的是XCode 7.0.1
Swizzle.self.jr_swizzleMethod(originalSelector, withMethod: swizzledSelector);
也不起作用。 - Kevin