Runtime(動態添加方法)筆記

OC採用的是懶加載機制,只要一個方法實現了,就會添加到方法列表中佔用內存。而很多時候,很多功能在某些用戶那裏是很少用到的,比如騰訊的xx會員,你不充值,是無法使用會員提供的服務的。這種情況下,可以考慮使用Runtime動態添加方法。

Demo鏈接

  • ViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];

    TestModel *testModel = [[TestModel alloc] init];

    //performSelector在動態添加方法時使用
    [testModel performSelector:@selector(write:)
                    withObject:@"動態添加方法測試"];
}
  • TestModel.m:創建TestModel用於Runtime測試動態添加方法
#import "TestModel.h"
#import <objc/message.h>//用於導入Runtime

@implementation TestModel
void writeChange(id self,SEL _cmd,NSString *str)
{
    NSLog(@"測試動態添加方法:%@",str);
}

//只要一個對象調用了一個未實現的方法就會調用這個方法進行處理,用於動態添加方法時,處理未實現方法
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    //找到未實現的方法
    if (sel == NSSelectorFromString(@"write:")) {

        /**
         * 動態添加方法

         * 參數1 添加方法的類
         * 參數2 添加哪個方法
         * 參數3 方法實現,替換方法(其實是函數)
         * 參數4 方法類型,參考文檔 Type Encodings
         */
        class_addMethod(self, sel, (IMP)writeChange, "v@:@");
        return YES;
    }

    return [super resolveInstanceMethod:sel];
}

@end
  • 運行效果
    動態添加方法測試效果圖
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章