Trong Objective-C, việc gọi phương thức được xử lý tại runtime. Điều này cho phép việc thực hiện một bộ chọn - selector (tức là phương thức) có thể thay đổi khi chương trình thực thi. Swizzling là hành động hoán đổi việc thực hiện của hai bộ chọn khi chương trình đang chạy. Sửa đổi chương trình động này tương tự như monkey patching, một khái niệm được hỗ trợ bởi các ngôn ngữ động khác.
Ví dụ, chúng ta swizzle phương thức viewDidAppear với một phương thức khác gọi viewDidAppear và sau đó in một log.
Xem xét:
#import
#import "UIViewController+Logging.h"
@implementation UIViewController (Logging)
+ (void)load {
static dispatch_once_t once_token;
dispatch_once(&once_token, ^{
SEL viewWillAppearSelector = @selector(viewDidAppear:);
SEL viewWillAppearLoggerSelector = @selector(logged_viewDidAppear:);
Method originalMethod = class_getInstanceMethod(self, viewWillAppearSelector);
Method extendedMethod = class_getInstanceMethod(self, viewWillAppearLoggerSelector);
method_exchangeImplementations(originalMethod, extendedMethod);
});
}
-(void) logged_viewDidAppear:(BOOL)animated {
[self logged_viewDidAppear:animated];
NSLog(@"logged view did appear for %@", [self class]);
}
@end