博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发 runtime实现原理以及实际开发中的应用
阅读量:6258 次
发布时间:2019-06-22

本文共 3222 字,大约阅读时间需要 10 分钟。

hot3.png

主要是这两个帖子

然后,关于里面的代码实现有2个比较不错的博客,可以参考

http://blog.sunnyxx.com

另外还可以补充其他一些:

//-----------------------------------刨根问底Objective-C Runtime ---------------------

就这些基本能搞懂这个runtime的原理了。

 

自己写了一个小例子:

A: 首先现在控制器里面初始化一个对象,然后调用对象的方法:

#import "ViewController.h"#import "Message.h"#import "NSObject+AssociatedObject.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];        Message *message = [Message new];    [message sendMessage:@"Sam Lau"];    }@end

B: 对象First的声明:

////  Message.h//  RuntimeDemo////  Created by caijunrong on 7/15/15.//  Copyright © 2015 caijunrong. All rights reserved.//#import 
@interface Message : NSObject- (void)sendMessage:(NSString *)word;@end

    对象First的实现:

////  Message.m//  RuntimeDemo////  Created by caijunrong on 7/15/15.//  Copyright © 2015 caijunrong. All rights reserved.//#import "Message.h"#import "MessageForwarding.h"#import 
@implementation Message//- (void)sendMessage:(NSString *)word//{//    NSLog(@"normal way : send message = %@", word);//}//- (void)sendOtherMessage:(NSString *)word{//    NSLog(@"sendOtherMessage word:%@",word);//}#pragma mark - Method Resolution/// override resolveInstanceMethod or resolveClassMethod for changing sendMessage method implementation+ (BOOL)resolveInstanceMethod:(SEL)sel{    if (sel == @selector(sendMessage:)) {                //如果是这个方法的话,重新定义一个新的方法,映射过去        class_addMethod([self class], sel, imp_implementationWithBlock(^(id self, NSString *word) {            NSLog(@"word = %@", word);            //通过这种方法可以讲找不到的方法重新定义到别的方法去            [self sendOtherMessage:word];        }), "v@*");    }    return YES;}#pragma mark - Fast Forwarding//- (id)forwardingTargetForSelector:(SEL)aSelector//{//    if (aSelector == @selector(sendMessage:)) {//        return [MessageForwarding new];//    }//    //    return nil;//}#pragma mark - Normal Forwarding- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{    NSMethodSignature *methodSignature = [super methodSignatureForSelector:aSelector];        if (!methodSignature) {        methodSignature = [NSMethodSignature signatureWithObjCTypes:"v@:*"];    }        return methodSignature;}- (void)forwardInvocation:(NSInvocation *)anInvocation{    MessageForwarding *messageForwarding = [MessageForwarding new];        if ([messageForwarding respondsToSelector:anInvocation.selector]) {        [anInvocation invokeWithTarget:messageForwarding];    }}@end

对象Second的声明:

////  MessageForwarding.h//  RuntimeDemo////  Created by caijunrong on 7/15/15.//  Copyright © 2015 caijunrong. All rights reserved.//#import 
@interface MessageForwarding : NSObject- (void)sendMessage:(NSString *)word;- (void)sendOtherMessage:(NSString *)word;@end

对象Second的实现:

////  MessageForwarding.m//  RuntimeDemo////  Created by caijunrong on 7/15/15.//  Copyright © 2015 caijunrong. All rights reserved.//#import "MessageForwarding.h"@implementation MessageForwarding- (void)sendMessage:(NSString *)word{    NSLog(@"fast forwarding way : send message = %@", word);}- (void)sendOtherMessage:(NSString *)word{    NSLog(@"MessageForwarding sendOtherMessage word:%@",word);}@end

 

 

 

 

转载于:https://my.oschina.net/caijunrong/blog/508738

你可能感兴趣的文章
【HTML5游戏开发小技巧】RPG情形对话中,令文本逐琢夸出
查看>>
ORA-04031:
查看>>
早晚有一天,我们都会成为自己当初讨厌的人
查看>>
基于SMTP协议的CMD命令邮件发送
查看>>
九度笔记之 1209最小邮票数
查看>>
Java中swap解惑
查看>>
HDU 2068 RPG的错排
查看>>
操作数有自增操作时复合表达式的陷阱
查看>>
从WW中剥离一个三维场景框架
查看>>
ASP.NET网页动态添加、更新或删除数据行
查看>>
vbs获取当前主机IP
查看>>
IIS7中的站点、应用程序和虚拟目录详细介绍
查看>>
为何C语言(的函数调用)需要堆栈,而汇编语言却不需要堆栈
查看>>
对Map按key和value分别排序
查看>>
知名第三方编译版tete009 Firefox 24.0
查看>>
java反射生成ORM
查看>>
堆和栈的区别
查看>>
生成CSV文件后再将CSV文件导入到mysql
查看>>
Html.DropDownListFor练习(2)
查看>>
Eclipse+Maven创建webapp项目<一>
查看>>