一、RunTime简介
- RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。
- 对于C语言,函数的调用在编译的时候会决定调用哪个函数。
- 对于OC语言,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。事实证明:1、在编译阶段,OC可以调用任何函数,即使用这个函数并未实现,只要声明过就不会报错。2、在编码阶段,C语言调用未实现的函数就会报错。
二、RunTime作用
1、发送消息 2、交换方法 3、动态添加方法 4、动态添加属性
1、发送消息:
方法调用的本质,就是让对象发送消息。
objc_msgSend,只有对象才参发送消息,因此以objc开头。
使用消息机制的前提,必须导入#import<objc/message.h>
报错:解决:
1、发送消息 2、交换方法 3、动态添加方法 4、动态添加属性
1、发送消息:
方法调用的本质,就是让对象发送消息。
objc_msgSend,只有对象才参发送消息,因此以objc开头。
使用消息机制的前提,必须导入#import<objc/message.h>
报错:解决:
objc_msgSend(void /* id self, SEL op, ... */ ) 解决报错:Too many arguments to function call, expected 0, have 2
解决方法:选中项目-Project- Build Settings -Enable Strict Checking of objc-msgSend Calls 。将其设置为NO即可。
例:
Persion.h
#import <Foundation/Foundation.h>
@interface Persion : NSObject
#pragma mark- 跑步
- (void)run;
+ (void)run;
- (void)run:(int)length;
@end
Persion.m
#import "Persion.h"
@implementation Persion
-(void)run
{
NSLog(@"公园跑步");
}
+ (void)run
{
NSLog(@"类方法跑步");
}
- (void)run:(int)length
{
NSLog(@"跑了多少米:=%d",length);
}
@end
ViewController.h
#import "ViewController.h"
#import "Persion.h"
#import <objc/message.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Persion *p=[[Persion alloc]init];
//调用对象方法
[p run];
[p performSelector:@selector(run)];
//本质:让对象发送消息
objc_msgSend(p, @selector(run));
//带参数的
objc_msgSend(p, @selector(run:),10);
//调用类方法
//第一种通过类名调用 类名调用类方法,本质类名转换成类对象。
[Persion run];
//第二种通过类对象调用
[[Persion class]run];
//用类名调用类方法,底层会自动把类名转换成对象调用
objc_msgSend([Persion class], @selector(run));
//OC:运行时机制,消息机制是在运行时机制最重要的机制
// 消息机制:任何方法调用,本质都是发送消息。
}