iOS开发 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 <Foundation/Foundation.h>
@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 <objc/runtime.h>
@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 <Foundation/Foundation.h>
@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
相关文章:
http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/
http://tech.glowing.com/cn/objective-c-runtime/
然后,关于里面的代码实现有2个比较不错的博客,可以参考
http://blog.sunnyxx.com
http://www.cnblogs.com/biosli/p/NSObject_inherit_2.html
另外还可以补充其他一些:
//-----------------------------------刨根问底Objective-C Runtime ---------------------
就这些基本能搞懂这个runtime的原理了。
iOS开发 runtime实现原理以及实际开发中的应用的更多相关文章
- iOS开发-Runtime详解
iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...
- [iOS 开发] WebViewJavascriptBridge 从原理到实战 · Shannon's Blog
前言:iOS 开发中,h5 和原生实现通信有多种方式, JSBridge 就是最常用的一种,各 JSBridge 类库的实现原理大同小异,这篇文章主要是针对当前使用最为广泛的 WebViewJavas ...
- 【如何快速的开发一个完整的iOS直播app】(原理篇)
原文转自:袁峥Seemygo 感谢分享.自我学习 目录 [如何快速的开发一个完整的iOS直播app](原理篇) [如何快速的开发一个完整的iOS直播app](播放篇) [如何快速的开发一个完整的 ...
- ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型
一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字 ...
- VR原理讲解及开发入门
本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持. 1. VR沉浸感和交互作用产生的原理: 在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...
- Cordova - 使用Cordova开发iOS应用实战1(配置、开发第一个应用)
Cordova - 使用Cordova开发iOS应用实战1(配置.开发第一个应用) 现在比较流行使用 html5 开发移动应用,毕竟只要写一套html页面就可以适配各种移动设备,大大节省了跨平台应用的 ...
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...
- OAuth的机制原理讲解及开发流程
本想前段时间就把自己通过QQ OAuth1.0.OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oaut ...
- iOS开发几年了,你清楚OC中的这些东西么!!!?
iOS开发几年了,你清楚OC中的这些东西么!!!? 前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1 ...
随机推荐
- 关于Linux下软件包aptitude的相关操作
aptitude+回车 - 进入aptitude操作界面,可以对预览查看各种软件包 aptitude show package_name - 列出与XXX相关的软件包信息,但是并不能看到该软件包所安装 ...
- ToolBar控件详解
ToolBar控件详解 在Activity中添加ToolBar 1.添加库 dependencies { ... compile "com.android.support:appcompat ...
- Python 3 re模块3个括号相关的语法
(?aiLmsux) (One or more letters from the set 'a', 'i', 'L', 'm', 's', 'u', 'x'.) The group matches t ...
- Android自定义ViewGroup(四、打造自己的布局容器)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51500304 本文出自:[openXu的博客] 目录: 简单实现水平排列效果 自定义Layo ...
- SQLite 数据类型(http://www.w3cschool.cc/sqlite/sqlite-data-types.html)
SQLite 数据类型 SQLite 数据类型是一个用来指定任何对象的数据类型的属性.SQLite 中的每一列,每个变量和表达式都有相关的数据类型. 您可以在创建表的同时使用这些数据类型.SQLite ...
- 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。
给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数. #include <iostream> ...
- Java: How to resolve Access Restriction error
Issue: Access restriction: The constructor 'BASE64Decoder()' is not API (restriction on required lib ...
- Gradle 的Daemon配置
最近升级到Android 2.2.2之后,运行之前的项目特别卡,基本上2分钟,好的时候1分半,查询了Android官网的说明说daemon能够加快编译.于是我也尝试开启Daemon. 在Windows ...
- Android初级教程:对文件和字符串进行MD5加密工具类
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/52200008 点击打开链接 之前写过一篇博文,是针对字符串进行md5加密的.今 ...
- Java基础---Java---IO流-----File 类、递归、删除一个带内容的目录、列出指定目录下文件夹、FilenameFilte
File 类 用来将文件或者文件夹封装成对象 方便对文件与文件夹进行操作. File对象可以作为参数传递给流的构造函数 流只用操作数据,而封装数据的文件只能用File类 File类常见方法: 1.创建 ...