我想实现 Xcode 3 中的“修复并继续功能”。
上下文:
主要思想是:当我需要“快速修复某些东西”时,我不会重新编译项目。我正在Attacker class
使用“更新”方法实现进行小编译,将其加载到内存中并替换在运行时实现的 VictimClass 方法incorrect
。我认为这种方法会比完整的项目重新编译更快。
当我完成修复时,我只是将Attacker class
方法源复制到Victim class
.
问题
目前,我不知道[super ...]
在 Attacker 类中调用的正确性如何。
例如,我有 VictimClass
@interface VictimClass : UIView @end
@implementation VictimClass
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
}
@end
@interface AttackerClass : NSObject @end
@implementation AttackerClass
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
[self setupPrettyBackground];
}
@end
....
// EXCHANGE IMPLEMENTATIONS
Method m = class_getInstanceMethod([AttackerClass class], @selector(drawRect:));
const char * types = method_getTypeEncoding(m);
IMP attackerImp = method_getImplementation(m);
class_replaceMethod([VictimClass class], @selector(drawRect:), attackerImp, types);
// Invoking drawRect on Victim
VictimClass * view = /* */;
[view setNeedsDisplay];
此时,当drawRect:
方法被调用时,这将导致异常,因为drawRect:
会在 NSObject 类上调用,而不是在 UIView 类上调用
所以,我的问题是,[super drawRect:]
在 AttackerClass 中调用的正确性如何,才有可能在运行时正确交换实现?
主要思想是提供一种方法来正确地用攻击者的类方法替换受害者类中的任何方法。一般来说,你不知道,超类Victim class
。
更新:添加了替换实现代码。