runtime应用场景

  • 场景1 ----------- runtime 发送消息 -----------
    • objc/msgSend 只有对象才能发送消息,因此以objc开头
    • 导入 #import <objc/message.h> 或者直接导入 #import <objc/runtime.h>
    • 注意 Xcode 6 之后代码检查 单独使用<objc/message.h>会报错
    • builtSeting 修改 Enable Strict Checking of objc_msgSend Calls -> NO 才能调用 objc_msgSend `

我们创建一个对象Dog 自定义一个实例方法和类方法,并实现方法:

#import <Foundation/Foundation.h>

@interface Dog : NSObject

-(void)run;

+(void)eat;

@end

#import "Dog.h"

@implementation Dog

-(void)run
{
    NSLog(@"一只狗正在奔跑");
}

+(void)eat
{
    NSLog(@"一只狗正在吃。。。");
}

@end

然后我们在vc里面使用

// 创建对象 -> 调用方法
Dog *d = [[Dog alloc] init];
// 调用方法 -> 实例方法
[d run];
// 系统底层本质 -> 让对象发消息
objc_msgSend(d, @selector(run)); // 等同于 [d run];
// 调用方法 -> 类方法
[Dog eat];
objc_msgSend([Dog class], @selector(eat)); // 等同于 [Dog eat];

消息机制原理:
对象根据方法编号SEL去映射表查找对应方法的实现,即我们在调用实例方法的时候,其实是实例对象d,在发送消息,消息的实现,其实是SEL,根据方法编号,去映射表查找对应方法的实现.类方法本质是[Dog class],发什么消息.

  • 场景2 ----------- runtime 交换方法 -----------
    使用场景,系统自带方法功能不够用,给系统自带的方法扩展一些功能,并保存原有功能:
    • 实现方法 1 -> 继承系统的类, 重写方法.
    • 实现方法 2 -> runtime 交换方法

案例:这里我们写一个UIImage的类目,来保证UIImage,不会被渲染,同时,如果图片为空,会打印提示.

#import <UIKit/UIKit.h>

@interface UIImage (Image)

// 创建一个类方法

// 传入 一个字符串 -> 返回 不被 渲染的原始图片

+ (id)ImageOriginalWithStrName:(NSString *)name;
@end

在.m进行实现, 使用method_exchangeImplementations(method1, method2)方法交换,详情看代码注释.


#import "UIImage+image.h"
#import <objc/runtime.h>

@implementation UIImage (image)
+(void)load
{
    //获取方法
    Method imageWithName = class_getClassMethod(self, @selector(imageOriginaWithStrName:));
    
    Method imageName = class_getClassMethod(self, @selector(imageNamed:));
    
    //交换方法
    method_exchangeImplementations(imageWithName, imageName);
}

+(id)imageOriginaWithStrName:(NSString *)name
{
    UIImage *image = [[self imageOriginaWithStrName:name] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    if (image == nil) {
        NSLog(@"加载图片为空");
    }
    
    return image;
}
@end

在vc中使用 :
UIImage *image = [UIImage imageNamed:@"123"];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,700评论 7 64
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,690评论 0 9
  • 新建一个OSX命令行项目,是一个然后看代码加命令行,显示结果 将OC编译成c语言的东西:cd到此目录下,然后:cl...
    我的梦想之路阅读 564评论 1 5
  • 一:姓名:王春兰。大三学生。最近两周的状态,去面试java软件开发职位,切实感受到,找工作的压力。我很庆幸,找到实...
    瑾兰阅读 605评论 0 1
  • 汪國真的《雨的隨想》不知道大家有沒有讀過? 其中有這麼一句: 心晴的时候,雨也是晴;心雨的时候,晴也是雨。 當時看...
    王大睿阅读 407评论 0 0