您当然可以使用运行时函数来做这样的事情,* 但我建议这正是引入Blocks来解决的问题。它们允许你传递一大块可执行代码——你的方法实际上可以接受一个 Block 作为参数并运行它。
这是一个SSCCE:
#import <Foundation/Foundation.h>
typedef dispatch_block_t GenericBlock;
@interface Albatross : NSObject
- (void)slapFace:(NSNumber *)n usingFish:(GenericBlock)block;
@end
@implementation Albatross
- (void)slapFace:(NSNumber *)n usingFish:(GenericBlock)block
{
if( [n intValue] > 2 ){
NSLog(@"Cabbage crates coming over the briny!");
}
else {
block(); // Execute the block
}
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
Albatross * p = [Albatross new];
[p slapFace:[NSNumber numberWithInt:3] usingFish:^{
NSLog(@"We'd like to see the dog kennels, please.");
}];
[p slapFace:[NSNumber numberWithInt:1] usingFish:^{
NSLog(@"Lemon curry?");
}];
}
return 0;
}
*请注意,使用method_setImplementation()
将更改以后每次从任何地方调用该方法时使用的代码——这是一个持久的更改。