RunTime小結黑魔法

來源:互聯網
上載者:User

標籤:

(一)攔截交換系統設定圖片的方法

#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小結黑魔法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.