//
// Person.h
// 03-runtime(動(dòng)態(tài)添加方法)
//
// Created by 紫荊秋雪 on 2017/2/24.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <objc/message.h>
@interface Person : NSObject
@end
//
// Person.m
// 03-runtime(動(dòng)態(tài)添加方法)
//
// Created by 紫荊秋雪 on 2017/2/24.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import "Person.h"
@implementation Person
void eat(id self, SEL sel) {
NSLog(@"eateat%@", self);
}
//有未實(shí)現(xiàn)的 ‘對象方法’的時(shí)候就會(huì)調(diào)用這個(gè)方法,在這個(gè)方法中進(jìn)行動(dòng)態(tài)添加方法的處理
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == NSSelectorFromString(@"eat")) {
//class: 給那個(gè)類添加方法
//SEL:添加那個(gè)方法
//IMP:方法實(shí)現(xiàn) 函數(shù) 函數(shù)入口 函數(shù)名
// type: 包含方法的參數(shù)
class_addMethod(self, sel, (IMP)eat, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
@end
2、對象發(fā)送不存在的方法
//
// ViewController.m
// 03-runtime(動(dòng)態(tài)添加方法)
//
// Created by 紫荊秋雪 on 2017/2/24.
// Copyright ? 2017年 Revan. All rights reserved.
//
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Person *p = [[Person alloc] init];
//p發(fā)送一個(gè)對象消息 eat
[p performSelector:@selector(eat)];
}
@end