我想使用方法调配,但我什至无法获得简单的示例来为我工作。我可能误解了这个概念是什么,但据我所知,它允许交换方法实现。
给定两种方法,A 和 B,我想交换它们的实现,以便调用 A 来执行 B。我遇到了一些 swizzling 的例子(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