会oc不会runtime就是不懂oc。近期项目需要做一些热更新,顺带着复习一下。
首先必须知道的是,oc的消息机制。废话不多说,直接上代码和注释。
// // main.m // rumtime // // Created by 123 on 16/7/4. // Copyright © 2016年 yipinbaike. All rights reserved. // #import <Foundation/Foundation.h> #import <objc/message.h> @interface Person : NSObject - (void)run; + (void)run; - (void)eatWith:(NSString*)food; @end @implementation Person - (void)run { NSLog(@"对象方法run"); } + (void)run{ NSLog(@"类方法run"); } - (void)eatWith:(NSString*)food{ NSLog(@"吃了:%@",food); } @end void text1(); void text2(); int main(int argc, const char * argv[]) { @autoreleasepool { // text1(); text2(); } return 0; } #pragma mark --消息机制 /* oc方法和c语言函数是不一样的,oc在编译的时候是不知道真正调用的是哪个函数,只有真正的在运行的时候才会通过函数名找到真正要调用的函数 oc语言采用的是消息机制,例如在text1中,调用的循序一次是从上到下三个方法。 */ //1.测试消息机制(不含参) void text1(){ //实例对象方法 Person * person = [[Person alloc]init]; [person run]; [person performSelector:@selector(run)]; objc_msgSend(person,@selector(run)); //类对象方法 //需要注意的是,直接使用 objc_msgSend(Person, @selector(run)) 是不被允许的。因为类方法的调用的实质是:将类名转化成类对象。而Person只是一个类名,不能直接调用消息函数 objc_msgSend() Class personClass = [Person class]; [personClass run]; [personClass performSelector:@selector(run)]; objc_msgSend(personClass, @selector(run)); } //2.测试消息机制(含参) void text2(){ //注意 performSelector 这个函数的传参的个数有限,一般是用字典或者数组来做这种处理 Person * person = [[Person alloc]init]; [person eatWith:@"包子"]; [person performSelector:@selector(eatWith:) withObject:@"包子"]; objc_msgSend(person, @selector(eatWith:),@"包子"); }
需要注意的是
1.运行以上代码需要导入#import <objc/message.h>
2.需要在Build Setting -> 搜索msg -> 设置属性为No(取消消息机制的检查)
时间: 2024-10-11 21:33:13