iOS里面Objective-C(OC)方法的懶加載 俗稱在運(yùn)行過程中動(dòng)態(tài)的添加方法沈贝。
1着绷、先創(chuàng)建Person類 把#import "Pseron.h" 引入 ViewController
#import "ViewController.h"
#import "Pseron.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Pseron * p = [[Pseron alloc]init];
//懶加載 用到的時(shí)候在加載方法!!
[p performSelector:@selector(eat)];
[p performSelector:@selector(eat:) withObject:@"板燒雞腿堡"];
}
2察纯、這樣編譯時(shí) 是報(bào)錯(cuò)的互墓,因?yàn)檫@個(gè)方法是沒有實(shí)現(xiàn)的,現(xiàn)在我們要去動(dòng)態(tài)的添加方法:來到Pseron.h
#import "Pseron.h"
#import <objc/message.h>
@implementation Pseron
//C語言的
//所有的C語言的函數(shù)里面!都有這兩個(gè)隱式參數(shù)!只要調(diào)用,哥么系統(tǒng)都會(huì)傳遞進(jìn)來!
//不帶參數(shù)的
void eat(id self, SEL _cmd){
NSLog(@"調(diào)用了%@對(duì)象的%@方法",self,NSStringFromSelector(_cmd));
}
//帶參數(shù)的
void eat1(id self, SEL _cmd,id obj){
NSLog(@"哥么今晚吃五個(gè)%@",obj);
}
//當(dāng)這個(gè)類被調(diào)用了沒有實(shí)現(xiàn)的方法!就會(huì)來到這里
+(BOOL)resolveInstanceMethod:(SEL)sel{
// NSLog(@"你沒有實(shí)現(xiàn)這個(gè)方法%@",NSStringFromSelector(sel));
if (sel == @selector(eat)) {
//這里報(bào)黃色警告的話纫事,沒問題的渗鬼,因?yàn)橄到y(tǒng)編譯的時(shí)候不知道用了runtime已經(jīng)添加了這個(gè)方法
/*
1.cls: 類類型
2.name: 方法編號(hào)
3.imp: 方法實(shí)現(xiàn),函數(shù)指針!
4.types:函數(shù)類型 C字符串(代碼) void === "v"
5.cmd+shift+0去看文檔
*/
class_addMethod([Pseron class],sel, (IMP)eat, "v@:");
}else if(sel == @selector(eat:)){
class_addMethod([Pseron class], sel, (IMP)eat1, "v@:@");
}
return [super resolveInstanceMethod:sel];
}