运行时-Runtime
消息机制 sel类型 (方法编号)
Person * p = [Person alloc];
[p eat:@"2"];
[p performSelector:@selector(eat)];
#import <objc/message.h>
objc_msgSend
Person * p = objc_msgSend(objc_msgSend(objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));
运行时 #import <objc/runtime.h>
平时所编写的OC代码,在程序运行时都转成了C语言代码,Runtime属于OC的幕后工作
有什么用?字典转模型
#import "NSURL+hook.h"
NSURL *url = [NSURL HK_UrlWithString:@"http://baidu.com/好的“];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSLog(@"%@",request);
#import <Foundation/Foundation.h>
@interface NSURL (hook)
+ (instancetype)HK_UrlWithString:(NSString *)urlstr;
@end
#import "NSURL+hook.h"
@implementation NSURL (hook)
+ (instancetype)HK_UrlWithString:(NSString *)urlstr
{
NSURL *url = [NSURL HK_UrlWithString:urlstr];
if (url == nil)
{
NSLog(@"url kongle ");
}
return url;
}
// 加载的时候
+ (void)load
{
Method urlStr = class_getClassMethod(self, @selector(URLWithString:));
Method hkurlStr = class_getClassMethod(self, @selector(HK_UrlWithString:));
method_exchangeImplementations(urlStr, hkurlStr);
NSLog(@"load");
}
@end
hook:钩子 面向切面编程
SEL:方法编号
IMP:方法实现(执行代码的指针)
—比如 :一本书 目录
标题 ———页码
SEL———IMP
二进制 数据、指令
装载 可执行文件装载进入内存