1、runtime实现动态添加方法
- 由于OC是动态语言,所以只要声明了一个方法,那么这个对象就是可以调用这个方法的,无论这个方法是否实现。当执行这个方式时,发现没有被实现那么就会报错,通过可以使用runtime动态添加方法,来解决这个问题。其次,使用performSelector方法也可以给对象方法消息。
- 一般情况,只要是声明的方法一定要实现,但是这样做有定义的弊端就是无论这些方法是否要用,都会被实现,那么就会添加到相应的“方法编号区”、“方法列表区”、“方法区”这样就会消耗内存,其实可以使用runtime的动态添加方法来解决这一状况。
2、实例
//
// Person.h
// 03-runtime(动态添加方法)
//
// 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(动态添加方法)
//
// 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);
}
//有未实现的 ‘对象方法’的时候就会调用这个方法,在这个方法中进行动态添加方法的处理
+ (BOOL)resolveInstanceMethod:(SEL)sel {
if (sel == NSSelectorFromString(@"eat")) {
//class: 给那个类添加方法
//SEL:添加那个方法
//IMP:方法实现 函数 函数入口 函数名
// type: 包含方法的参数
class_addMethod(self, sel, (IMP)eat, "v@:");
return YES;
}
return [super resolveInstanceMethod:sel];
}
@end
//
// ViewController.m
// 03-runtime(动态添加方法)
//
// 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发送一个对象消息 eat
[p performSelector:@selector(eat)];
}
@end