写完标题,我也扑通一笑.就先来对标题透一下剧吧.

  "谁说我不能执行你":应该把"我"与"你"理解成OC语言中不同类的实例对象.<IT男永远不孤单,因为IT男搞的就是面向对象的编程>

  是的,在今天之前,我是不相信:我能执行你.但是,现在我相信了,没想到我是如此的强大,只是我没有发现而已!

  之前,我一直是这样认为的:在iOS开发中,A类的对象a,是不能去执行B类中的实例方法的.其实不是这样的.

  的确,在iOS中,是没有多继承的,只有单继承.在其它语言中,很容易实现两个不同类的对象去拥有同一个方法,因为他们是多继承的,他们就好比两个男生能拥有同一个妹子一样.iOS就没那么泛滥,是很单纯的,因为只有单继承.

  现实中,需求是千奇百怪的.特殊情况,需要特殊处理.有时候在iOS开发中,也需要A类的对象a去执行B类中的实例方法.为了达到这一点,先来介绍一下消息转发机制.

消息转发

  其实,当向某个对象发送某个消息时,runtime system在当前和父类中都找不到对应的实现方法是,runtime system并不会立即报错误使程序崩溃,而是依次执行下列步骤: 

  1,动态方法

  像当前类发送+ (BOOL)resolveInstanceMethod:(SEL)sel信号,检查是否动态向该类添加了方法.可进入这个博客查看:http://blog.csdn.net/haishu_zheng/article/details/12873151

  2,快速消息转发

  检查该类是否实现了- (id)forwardingTargetForSelector:(SEL)aSelector方法,若实现了则调用这个方法.若该方法返回值对象非nil或者分self,则向该返回对象从新发送消息.

  3,标准消息转发

  runtime发送- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector消息获取selector对应方法签名.返回值非空则通过- (void)forwardInvocation:(NSInvocation *)anInvocation转发消息,返回值为空则像当前对象发送doesNotRecognizeSelector:消息,程序崩溃退出.

  总结:能用以上2,3方式实现消息的转发.

快速消息转发

快速消息转发的实现方法很简单,只需要重写 - (id)forwardingTargetForSelector:(SEL)aSelector  方法即可。
我来举个简单的例子,比如现有2个类:Teacher 和 Doctor,Doctor可以做手术(operate方法)。

Teacher.h

#import <Foundation/Foundation.h>

@interface Teacher : NSObject

@end

Teacher.m

#import "Teacher.h"

#import "Doctor.h"

@implementation Teacher

- (id)forwardingTargetForSelector:(SEL)aSelector {

Doctor* doctor = [[Doctor alloc] init];

if ([doctor respondsToSelector:aSelector]) {

return doctor;

}

return nil;

}

@end

Doctor.h

#import <Foundation/Foundation.h>

@interface Doctor : NSObject

- (void)operate;

@end

Doctor.m

#import "Doctor.h"

@implementation Doctor

- (void)operate; {

NSLog(@"operate");

}

@end

到这里还差一步,再弄一个分类.具体是为什么,自己想.

Teacher+DoctorMethod.h

#import "Teacher.h"

@interface Teacher (DoctorMethod)

- (void)operate;

@end

Teacher+DoctorMethod.m

#import "Teacher+DoctorMethod.h"

@implementation Teacher (DoctorMethod)

@end

ok,现在可以到main.m中了

#import <Foundation/Foundation.h>

#import "Teacher.h"

#import "Teacher+DoctorMethod.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

Teacher* teacher = [[Teacher alloc] init];

[teacher operate];

}

return 0;

}

log:2015-04-26 17:45:45.134 Quichly[3304:381361] operate

成功了!

标准消息转发 <待续...>

转载于:https://www.cnblogs.com/iOS771722918/p/4458109.html

iOS谁说我不能执行你相关推荐

  1. 如何让iOS设备上App定时执行后台任务(上)

    功能需求 很多情况下,我们希望自己的App可以每小时或每天的特定时间在 iPhone 或 iPad 自动执行后台任务,比如:后台定时下载新数据或清理CoreData数据库等. 移动设备不像PC或服务器 ...

  2. iOS 脚本工具,自动执行 UnitTest 单元测试

    适用范围:模拟器 适用方法:1. 模拟器编译运行:2. 执行 xctool 运行 [自动化测试应用](https://techbeacon.com/5-must-have-open-source-to ...

  3. ios web input.onchange 不执行

    今天做 文件上传处理的时候发现两个问题: input.onchange ios web 代码不执行有异常,其他端都是好的:检查代码发现以:参数 event  ios web 拿不到文件相关属性:可改用 ...

  4. iOS 视图控制器的方法执行顺序

    1 alloc  视图开始创建时, 需要开辟一个新的内存空间, 这时就需要alloc申请一块新的内存空间. 2 init  初始化视图. 3 ViewLoad, ViewDidLoad    通过英文 ...

  5. 25个增强iOS应用程序性能的提示和技巧 — 中级篇

    本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...

  6. iOS 无限后台运行

    2019独角兽企业重金招聘Python工程师标准>>> 根据苹果文档中关于后台执行的描述,任何app都有10分钟左右的后台任务执行时间. 10分钟后,app会被iOS强行挂起. 但是 ...

  7. IOS可执行文件学习总结

    了解iOS上的可执行文件和Mach-O格式 http://www.cocoachina.com/mac/20150122/10988.html   很多朋友都知道,在Windows上exe是可直接执行 ...

  8. Reveal:分析iOS UI该武器

    Reveal是分析iOS应用UI的利器: Reveal可以在执行时调试和改动iOS应用程序.它能连接到应用程序,并同意开发人员编辑各种用户界面參数.这反过来会马上反应在程序的UI上.就像用FireBu ...

  9. iOS逆向之hook框架frida的安装和使用

    一.Frida 利用 Hopper.class-dump.ios-ssl-kill-switch.Keychain-Dumper.MachOParser 可以进行静态分析. 使用 CycriptTri ...

最新文章

  1. 《适用于初学者的 Python》
  2. python长度分割文本_python 按照固定长度分割字符串的方法小结
  3. linux内存显示3.54g,为什么WDCP/linux服务器内存一直显示几乎用完了
  4. 小能量汇聚成大能量_清体能量棒配料解析:小种子,大能量,藜麦和青稞
  5. 《Leetcode | 02》
  6. 我做技术的这十年,我不做技术的这一年~
  7. 东南大学成贤c语言试卷,成贤高数(下)期中试卷参考答案
  8. php算法结构,PHP数据结构与算法:顺序表
  9. python 菜鸟-Python3 面向对象
  10. MVVM开发模式MVVM Light Toolkit
  11. 【转】SQLServer2005中的增强数据类型VARCHAR(MAX)
  12. 基于树莓派的人脸识别门禁系统
  13. 语言代号/地区代号/国家代号
  14. win10无法正常弹出移动硬盘/U盘
  15. python 等值面_ANSYS Fluent快速添加等值面/等值线 源代码-教育代码类资源
  16. STM32常用的开发工具有哪些?
  17. 推荐的这22个高频 CLI 工具,确定不收藏吗?
  18. openjudge白细胞计数
  19. 格与布尔代数(笔记)
  20. oracle CLOB与BLOB的区别及使用

热门文章

  1. redis 缓存预热_Redis异常问题解决方案:缓存雪崩、预热、穿透、击穿、降解方案分析...
  2. 战队不显示名字了_年仅17岁的新人选手!峡谷之巅1200分!被16家战队哄抢
  3. 多线程(thread)+进程(Process)
  4. Java中重定向,转发深入理解 2021-04-26
  5. mysql sync es 异步双写_mysql数据同步es方案思考
  6. html5与python哪个好_3个原因告诉你,为什么选择HTML5大前端?
  7. python 参数收集_Python参数传递及收集机制原理解析
  8. html剧场座位设计图,如何设计剧院座位,21个细部案例
  9. 云服务器更换系统后tomcat,如何对云服务器装tomcat
  10. 计算机级用英语怎么说,计算机国家一级用英语怎么说