Swizzling method
The swizzling method replaces the implementation of two class methods at runtime . This will affect every instance that was or will be created, of the modified class.
Example: Suppose you wrote a category for NSString:
@interface NSString (Swizzling)
@end
@implementation NSString (Swizzling)
- (NSString *)swizzled_uppercaseString {
NSString *result = [self swizzled_uppercaseString];
result = [result stringByAppendingString:@" (swizzled)"];
return result;
}
@end
uppercaseString swizzled_uppercaseString, swizzled_uppercaseString , uppercaseString. ( uppercaseString swizzled_uppercaseString):
#import <objc/runtime.h>
NSString *sample = @"abc";
NSLog([sample uppercaseString]);
original = class_getInstanceMethod([NSString class], @selector(uppercaseString));
swizzled = class_getInstanceMethod([NSString class], @selector(swizzled_uppercaseString));
method_exchangeImplementations(original, swizzled);
NSLog([sample uppercaseString]);
ISA Swizzling
ISA swizzling , ISA ('is a'), , .
:
, :
@interface Sample : NSObject
@property (nonatomic) NSString *sampleStringToLoad;
@end
@implementation Sample
@synthesize sampleStringToLoad;
@end
@interface SampleWithStringLoader :NSObject
@property (nonatomic) NSString *sampleStringToLoad;
-(void)loadString;
@end
@implementation SampleWithStringLoader
@synthesize sampleStringToLoad;
-(void)loadString {
self.sampleStringToLoad = @"abc";
}
@end
SampleWithStringLoader, sampleStringToLoad :
#import <objc/runtime.h>
Sample *sample = [Sample new];
object_setClass(sample, [SampleWithStringLoader class]);
[sample performSelector:@selector(loadString)];
object_setClass(sample,[Sample class]);
NSLog(sample.sampleStringToLoad);