美文网首页
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访问私有方法

    1、应用场景 在OC中,我们只能访问暴露在 .h 文件中的方法,如果 .h 文件中没有声明,那么这个方法外界是不能...

  • Javascript 面向对象(共有方法,私有方法,特权方法,静

    一,私有属性和方法 私有方法:私有方法本身是可以访问类内部的所有属性(即私有属性和公有属性),但是私有方法是不可以...

  • 公有、私有、静态属性和方法的区别2018-07-10

    //私有方法:私有方法本身是可以访问类内部的所有属性(即私有属性和公有属性),但是私有方法是不可以在类的外部被调用...

  • 老男孩python--面向对象25

    1.子类无法访问父类的私有字段,如果要访问,可以在父类中写一个公有方法,子类继承该方法间接访问私有字段 2.__i...

  • 2017-5-26

    1.面向对象,私有方法,私有属性,魔法方法,私有变量通过方法被访问从而被封装2.对象的传递3.del引用计数的缩减...

  • 动态调用私有域和私有方法

    1、定义一个含私有方法的类 2、动态调用该私有方法。注意在动态调用私有方法的过程中,必须压制java的访问检查,否...

  • 私有属性/公有属性的理解

    1.私有属性 在对象内部使用'var'关键字来声明,而且它只能被私有函数和特权方法访问。 2.私有方法 在对象的构...

  • 面向对象一私有属性

    class Person(object): 在对象中,提供set/get方法,来间接的访问对象的私有属性 给私有属...

  • 面向对象编程

    私有属性 无法直接访问,通过get,set操作 方法 发短信案例 - 三维的案例,生孩子的私有方法 __del__...

  • ActionScript3.0基础(一)

    访问控制属性: public:公有属性 private:私有类型的变量和方法只允许定义它们的类访问,其他类访问报错...

网友评论

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

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