iOS —— RunTime详解(发送消息)一

一、RunTime简介
  • RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。
  • 对于C语言,函数的调用在编译的时候会决定调用哪个函数。
  • 对于OC语言,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。事实证明:1、在编译阶段,OC可以调用任何函数,即使用这个函数并未实现,只要声明过就不会报错。2、在编码阶段,C语言调用未实现的函数就会报错。
二、RunTime作用
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:运行时机制,消息机制是在运行时机制最重要的机制
    // 消息机制:任何方法调用,本质都是发送消息。
    
}

猜你喜欢

转载自blog.csdn.net/u012189584/article/details/79542625