美文网首页
001-runtime访问私有方法

001-runtime访问私有方法

作者: 紫荆秋雪_文 | 来源:发表于2017-02-24 10:45 被阅读30次

    1、应用场景

    • 在OC中,我们只能访问暴露在 .h 文件中的方法,如果 .h 文件中没有声明,那么这个方法外界是不能调用的。
    • 但是如果你知道这个方法名,那么可以使用 runtime 来方法到 ‘私有方法’

    2、实例 - OC调用方法过程

    • 1、定义一个Person对象,并且暴露出来一个eat: 方法
    //
    //  Person.h
    //  001-runtime(访问私有方法)
    //
    //  Created by 紫荆秋雪 on 2017/2/24.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    - (void)eat:(NSString *) eatName;
    @end
    
    
    • 2、eat: 方法的实现
    //
    //  Person.m
    //  001-runtime(访问私有方法)
    //
    //  Created by 紫荆秋雪 on 2017/2/24.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import "Person.h"
    
    @implementation Person
    - (void)eat:(NSString *)eatName {
        NSLog(@"今天吃了%@", eatName);
    }
    @end
    
    
    • 3、方法的调用
    //
    //  ViewController.m
    //  001-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:@"黄焖鸡"];
    }
    @end
    
    

    3、实例 - runtime 调用 私有方法

    • 在 .h 文件中没有暴露方法的声明
    //
    //  Person.h
    //  001-runtime(访问私有方法)
    //
    //  Created by 紫荆秋雪 on 2017/2/24.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    //- (void)eat:(NSString *) eatName;
    @end
    
    
    • 私有方法的实现
    //
    //  Person.m
    //  001-runtime(访问私有方法)
    //
    //  Created by 紫荆秋雪 on 2017/2/24.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import "Person.h"
    
    @implementation Person
    - (void)eat:(NSString *)eatName {
        NSLog(@"今天吃了%@", eatName);
    }
    @end
    
    
    • 使用 runtime 来调用 对象的 私有方法
    //
    //  ViewController.m
    //  001-runtime(访问私有方法)
    //
    //  Created by 紫荆秋雪 on 2017/2/24.
    //  Copyright © 2017年 Revan. All rights reserved.
    //
    
    #import "ViewController.h"
    #import <objc/message.h>
    #import "Person.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        Person *p = objc_msgSend([Person class], @selector(alloc));
        p = objc_msgSend(p, @selector(init));
        
        objc_msgSend(p, @selector(eat:), @"水煮鱼");
    }
    @end
    
    

    相关文章

      网友评论

          本文标题:001-runtime访问私有方法

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