iOS runtime方法交换,动态添加属性

runtime在项目中越来越常见,学会runtime还是需要的,废话不多说,直接进入主题。

1.使用runtime实现方法交换

例如:加载图片,[UIImage imageNamed:@"timg"]返回图片是否加载成功结果,系统方法没有返回结果,就需要我们方法交换来实现了。

1.1先创建一个UIImage的类别

在.m文件中实现以下方法

+ (void)load {

    //方法交换

    //类方法

    MethodimageNamedMethod =class_getClassMethod(self,@selector(imageNamed:));

    Methodlzy_imageNamedMethod =class_getClassMethod(self,@selector(lzy_imageNamed:));

    method_exchangeImplementations(imageNamedMethod, lzy_imageNamedMethod);

    //对象方法

    //class_getInstanceMethod(<#Class  _Nullable __unsafe_unretained cls#>, <#SEL  _Nonnull name#>)

}

///加载图片 返回成功/失败

+ (UIImage*)lzy_imageNamed:(NSString*)name {

    UIImage*image = [selflzy_imageNamed:name];

    if(image) {

        NSLog(@"加载图片成功");

    }else{

        NSLog(@"加载图片失败");

    }

    returnimage;

}

1.2使用

导入头文件 #import "UIImage+Image.h"

//加载UIImage 返回成功/失败

UIImage*image = [UIImageimageNamed:@"timg"];

2.动态添加属性

2.1创建一个NSObject类别

在.h文件中添加属性 name

@interfaceNSObject (Property)

///名称 分类中的属性  只有声明的setter,getter方法, 没有实现的setter,getter方法, 也没有下划线成员变量

@property (nonatomic, copy) NSString *name;

@end

在.m文件中实现setter,getter方法

- (void)setName:(NSString*)name {

    //添加属性 与 类关联

    objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_COPY);

}

- (NSString*)name {

    return objc_getAssociatedObject(self, "name");

}

2.2使用

导入头文件 #import "NSObject+Property.h"

//创建NSObject

    NSObject*object = [[NSObjectalloc]init];

    object.name = @"runtime动态添加属性";

    NSLog(@"%@", object.name);

Demo地址: Demo地址

如有错误,请指出

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容