给分类添加属性
Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
例如用一个聊天第三方库可以给他的个人信息类中添加自己需要的属性。
关键方法:objc_getAssociatedObject / objc_setAssociatedObject
char* const sex = "str";
- (void)setStr:(NSString *)str1 {
objc_setAssociatedObject(self,sex,str1,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)str {
return objc_getAssociatedObject(self,sex);
}
给系统方法扩展功能
一个系统的方法往往不容易满足开发者的所有需求 所以直接给系统扩展功能是一个极好的选择,实现方法。利用继承也可以重写方法这里利用runtime的方式去实现。如下新建一个Category扩展UIImage的imageName方法
关键方法:class_getClassMethod/method_exchangeImplementations
//load方法会在类第一次加载的时候被调用
+ (void)load
{
// 交换方法
// 获取imageWithName方法地址
Method imageWithName = class_getClassMethod(self, @selector(imageReplaceMethod:));
// 获取imageWithName方法地址
Method imageName = class_getClassMethod(self, @selector(imageNamed:));
// 交换方法地址,相当于交换实现方式
method_exchangeImplementations(imageWithName, imageName);
}
+ (instancetype)imageReplaceMethod:(NSString *)name
{
// 这里调用imageWithName,相当于调用imageName
UIImage *image = [self imageReplaceMethod:name];
if (image == nil) {
NSLog(@"加载失败");
}
return image;
}
demo地址:https://github.com/yihoushuhang/runtime
也可以查看百度大神的demo:https://github.com/forkingdog/FDFullscreenPopGesture