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地址
如有错误,请指出