給分類添加屬性
Category是Objective-C中常用的語(yǔ)法特性耘斩,通過它可以很方便的為已有的類來添加函數(shù)。但是Category不允許為已有的類添加新的屬性或者成員變量。
例如用一個(gè)聊天第三方庫(kù)可以給他的個(gè)人信息類中添加自己需要的屬性。
關(guān)鍵方法: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);
}
給系統(tǒng)方法擴(kuò)展功能
一個(gè)系統(tǒng)的方法往往不容易滿足開發(fā)者的所有需求 所以直接給系統(tǒng)擴(kuò)展功能是一個(gè)極好的選擇,實(shí)現(xiàn)方法拣帽。利用繼承也可以重寫方法這里利用runtime的方式去實(shí)現(xiàn)。如下新建一個(gè)Category擴(kuò)展UIImage的imageName方法
關(guān)鍵方法:class_getClassMethod/method_exchangeImplementations
//load方法會(huì)在類第一次加載的時(shí)候被調(diào)用
+ (void)load
{
// 交換方法
// 獲取imageWithName方法地址
Method imageWithName = class_getClassMethod(self, @selector(imageReplaceMethod:));
// 獲取imageWithName方法地址
Method imageName = class_getClassMethod(self, @selector(imageNamed:));
// 交換方法地址嚼锄,相當(dāng)于交換實(shí)現(xiàn)方式
method_exchangeImplementations(imageWithName, imageName);
}
+ (instancetype)imageReplaceMethod:(NSString *)name
{
// 這里調(diào)用imageWithName减拭,相當(dāng)于調(diào)用imageName
UIImage *image = [self imageReplaceMethod:name];
if (image == nil) {
NSLog(@"加載失敗");
}
return image;
}
demo地址:https://github.com/yihoushuhang/runtime
也可以查看百度大神的demo:https://github.com/forkingdog/FDFullscreenPopGesture?