標籤:
(一)攔截交換系統設定圖片的方法
#import <UIKit/UIKit.h>@interface UIImage (MyImage)+ (UIImage *)theNewImageName:(NSString *)name;@end
#import "UIImage+MyImage.h"#import <objc/runtime.h>@implementation UIImage (MyImage)+ (void)load{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //交換設定圖片的方法#pragma mark ---如果需要交換的方法是 “-”執行個體方法 就用 class_getInstanceMethod, ,如果是“+”類方法 就用class_getClassMethod Method originMethod = class_getClassMethod(self, @selector(imageNamed:)); Method customMethod = class_getClassMethod(self, @selector(theNewImageName:)); method_exchangeImplementations(originMethod, customMethod); });}+ (UIImage *)theNewImageName:(NSString *)name{ NSString *theName = [NSString stringWithFormat:@"new_%@",name]; return [UIImage theNewImageName:theName];}@end
(二)給系統類別添加屬性
#import <Foundation/Foundation.h>@interface NSDictionary (MyDictionary)//給字典類增加屬性@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSString *gender;@end
#import "NSDictionary+MyDictionary.h"#import <objc/runtime.h>@implementation NSDictionary (MyDictionary)/** 在延展裡面都 * object:要關聯的對象 key:要關聯的屬性的key值 value:要關聯的屬性 polocy:是枚舉類型 enum { OBJC_ASSOCIATION_ASSIGN = 0, 所修飾的屬性對象是弱引用的 OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, 強引用,非安全執行緒 OBJC_ASSOCIATION_COPY_NONATOMIC = 3, 指定相關的複製對象,非安全執行緒 OBJC_ASSOCIATION_RETAIN = 01401, 指定關聯的對象的強引用,安全執行緒 預設atomic OBJC_ASSOCIATION_COPY = 01403 指定相關的複製對象 ,預設是atomic }; */- (void)setName:(NSString *)name{ objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);}- (NSString *)name{ return objc_getAssociatedObject(self, @selector(name));}- (void)setGender:(NSString *)gender{ objc_setAssociatedObject(self, @selector(gender), gender, OBJC_ASSOCIATION_COPY_NONATOMIC);}- (NSString *)gender{ return objc_getAssociatedObject(self, @selector(gender));}@end
(三)使用RunTime給類屬性歸檔
#import <Foundation/Foundation.h>@interface Person : NSObject- (void)eat;- (void)drink;@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSString *gender;@property (nonatomic, assign) NSInteger age;@end
//歸檔- (void)encodeWithCoder:(NSCoder *)aCoder{ unsigned int count = 0; //1.獲得變數列表數組 Ivar *ivarList = class_copyIvarList([self class], &count); //2.迴圈 for (int i = 0; i < count; i++) { //3.擷取變數名 Ivar ivar = ivarList[i]; //4.將c語言字串轉換成 oc字串 NSString *ivarString = [NSString stringWithUTF8String:ivar_getName(ivar)]; //5.歸檔 [aCoder encodeObject:[self valueForKey:ivarString] forKey:ivarString]; }}//反歸檔- (instancetype)initWithCoder:(NSCoder *)aDecoder{ self = [super init]; if (self) { unsigned int count = 0; Ivar *ivarList = class_copyIvarList([self class], &count); for (int i = 0; i < count; i++) { Ivar ivar = ivarList[i]; NSString *ivarString = [NSString stringWithUTF8String:ivar_getName(ivar)]; //反歸檔 [self setValue:[aDecoder decodeObjectForKey:ivarString] forKey:ivarString]; } } return self;}
RunTime小結黑魔法