runtime:分类添加属性||添加方法||交换方法

这里是整理一些其他人的demo,方便以后忘记回来查看,简书用的不熟悉,设置改为markdown以后不知道怎么去添加链接了,有时间在研究……(经过几分钟查看后,我找到了基本语法,so easy)传送门
利用分类+runtime实现的一句代码站位图

一、分类添加属性
#import <objc/message.h>
@implementation NSObject (Category)
-(void)setAge:(NSString *)age{
// 添加属性,跟对象
// 给某个对象产生关联,添加属性
// object:给哪个对象添加属性
// key:属性名,根据key去获取关联的对象 ,void * == id
// value:关联的值
// policy:策越
objc_setAssociatedObject(self, @"age", age, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
//    _name = name;
}
-(NSString *)age{
   return objc_getAssociatedObject(self, @"age");
}
@end
二、动态添加方法

VC调用的类

 @implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Cat *cat=[[Cat alloc]init];
[cat performSelector:@selector(eat:) withObject:@22];
}

添加方法的类
#import <objc/message.h>
@implementation Cat
// 动态添加方法,首先实现这个resolveInstanceMethod
// resolveInstanceMethod调用:当调用了没有实现的方法没有实现就会调用 resolveInstanceMethod
// resolveInstanceMethod作用:就知道哪些方法没有实现,从而动态添加方法
// sel:没有实现方法

// 定义函数
// 没有返回值,参数(id,SEL)
// void(id,SEL)
void eatFunc(id self, SEL _cmd, id num)
{

    NSLog(@"调用eat %@ %@ %@",self,NSStringFromSelector(_cmd),num);
}


+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    //    NSLog(@"%@",NSStringFromSelector(sel));
// 动态添加eat方法

if (sel == @selector(eat:)) {
    /*
     cls:给哪个类添加方法
     SEL:添加方法的方法编号是什么
     IMP:方法实现,函数入口,函数名
     types:方法类型   可查看官方文档查询:Type Encodings
     */
    // @:对象 :SEL
    class_addMethod(self, sel, (IMP)eatFunc, "v@:@");
    // 处理完
    return YES;
    
}

return [super resolveInstanceMethod:sel];
}

@end
三、方法交换
#import <objc/message.h>
@implementation UIImage (DWQcategory)

+ (void)load
{

// 交换方法实现,方法都是定义在类里面
// class_getInstanceMethod:获取对象
// class_getClassMethod:获取类方法
// IMP:方法实现

// imageNamed
// Class:获取哪个类方法
// SEL:获取方法编号,根据SEL就能去对应的类找方法
Method imageNameMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));

// xmg_imageNamed
Method dwq_imageNamedMethod = class_getClassMethod([UIImage class], @selector(dwq_imageNamed:));

// 交换方法实现
method_exchangeImplementations(imageNameMethod, dwq_imageNamedMethod);

}

// 运行时

+ (UIImage *)dwq_imageNamed:(NSString *)imageName
{
// 1.加载图片
UIImage *image = [UIImage dwq_imageNamed:imageName];

// 2.判断功能
if (image == nil) {
    NSLog(@"图片为空");
}

return image;
}@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容