runtime

一:可遍历苹果类内部的成员变量,属性,方法
例如想改变UITextField的placeholder的字体颜色

#import 

@interface XMGTextField : UITextField

@end
#import "XMGTextField.h"
#import 

@implementation XMGTextField

+ (void)initialize
{
    [self getIvars];
}

//+ (void)getProperties
//{
//    unsigned int count = 0;
//    
//    objc_property_t *properties = class_copyPropertyList([UITextField class], &count);
//    
//    for (int i = 0; i   %s", property_getName(property), property_getAttributes(property));
//    }
//    
//    free(properties);
//}

+ (void)getIvars
{
    unsigned int count = 0;
    
    // 拷贝出所有的成员变量列表
    Ivar *ivars = class_copyIvarList([UITextField class], &count);
    
    for (int i = 0; i

二:可以交换两个方法的实现

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.imageView.image = [UIImage imageNamed:@"333"];
    
}

#import 

@interface UIImage (SWLExtension)

@end

#import "UIImage+SWLExtension.h"
#import 

@implementation UIImage (SWLExtension)

//load:当类加载进内存的时候调用,而且不管有没有子类,都只会调用一次,在main函数之前调用
+(void)load{
    
    Method imageNamedMethod = class_getClassMethod(self, @selector(imageNamed:));
    // 获取xmg_imageNamed
    Method xmg_imageNamedMethod = class_getClassMethod(self, @selector(xmg_imageNamed:));
    
    // 交互方法:runtime
    method_exchangeImplementations(imageNamedMethod, xmg_imageNamedMethod);
}

+ (UIImage *)xmg_imageNamed:(NSString *)name{
    UIImage *image = [UIImage xmg_imageNamed:name];
    if (!image) {
        NSLog(@"失败");
    }else{
        NSLog(@"成功");
    }
    return image;
}

@end

你可能感兴趣的:(runtime)