美文网首页
003-runtime动态添加方法

003-runtime动态添加方法

作者: 紫荆秋雪_文 | 来源:发表于2017-02-25 12:53 被阅读41次

    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 <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
    
    
    • 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动态添加方法

          本文链接:https://www.haomeiwen.com/subject/wsdwwttx.html