003-runtime动态添加方法

1、runtime实现动态添加方法

  • 由于OC是动态语言,所以只要声明了一个方法,那么这个对象就是可以调用这个方法的,无论这个方法是否实现。当执行这个方式时,发现没有被实现那么就会报错,通过可以使用runtime动态添加方法,来解决这个问题。其次,使用performSelector方法也可以给对象方法消息。
  • 一般情况,只要是声明的方法一定要实现,但是这样做有定义的弊端就是无论这些方法是否要用,都会被实现,那么就会添加到相应的“方法编号区”、“方法列表区”、“方法区”这样就会消耗内存,其实可以使用runtime的动态添加方法来解决这一状况。

2、实例

  • 1、创建对象
//
//  Person.h
//  03-runtime(动态添加方法)
//
//  Created by 紫荆秋雪 on 2017/2/24.
//  Copyright © 2017年 Revan. All rights reserved.
//

#import 
#import 
@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

  • 2、对象发送不存在的方法
//
//  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

你可能感兴趣的:(003-runtime动态添加方法)