@interface Person : NSObject
@property (nonatomic, strong, nullable) NSString *firstName;
@property (nonatomic, strong, nullable) NSString *lastName;
@end
@implementation Person
@end
NSString *demo_getLastName(id self, SEL selector)
{
return @"Apple";
}
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *person = [[Person alloc] init];
person.firstName = @"Tom";
person.lastName = @"Google";
NSLog(@"person full name: %@ %@", person.firstName, person.lastName);
// 1.创建一个子类
NSString *oldName = NSStringFromClass([person class]);
NSString *newName = [NSString stringWithFormat:@"Subclass_%@", oldName];
Class customClass = objc_allocateClassPair([person class], newName.UTF8String, 0);
objc_registerClassPair(customClass);
// 2.重写get方法
SEL sel = @selector(lastName);
Method method = class_getInstanceMethod([person class], sel);
const char *type = method_getTypeEncoding(method);
class_addMethod(customClass, sel, (IMP)demo_getLastName, type);
// 3.修改修改isa指针(isa swizzling)
object_setClass(person, customClass);
NSLog(@"person full name: %@ %@", person.firstName, person.lastName);
Person *person2 = [[Person alloc] init];
person2.firstName = @"Jerry";
person2.lastName = @"Google";
NSLog(@"person2 full name: %@ %@", person2.firstName, person2.lastName);
}
@end
// 输出
person full name: Tom Google
person full name: Tom Apple
person2 full name: Jerry Google
lastName
最新推荐文章于 2022-03-17 21:48:26 发布