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
//
// 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
//
// 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 调用 私有方法
//
// 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
//
// 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
网友评论