iOS谁说我不能执行你
写完标题,我也扑通一笑.就先来对标题透一下剧吧.
"谁说我不能执行你":应该把"我"与"你"理解成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谁说我不能执行你相关推荐
- 如何让iOS设备上App定时执行后台任务(上)
功能需求 很多情况下,我们希望自己的App可以每小时或每天的特定时间在 iPhone 或 iPad 自动执行后台任务,比如:后台定时下载新数据或清理CoreData数据库等. 移动设备不像PC或服务器 ...
- iOS 脚本工具,自动执行 UnitTest 单元测试
适用范围:模拟器 适用方法:1. 模拟器编译运行:2. 执行 xctool 运行 [自动化测试应用](https://techbeacon.com/5-must-have-open-source-to ...
- ios web input.onchange 不执行
今天做 文件上传处理的时候发现两个问题: input.onchange ios web 代码不执行有异常,其他端都是好的:检查代码发现以:参数 event ios web 拿不到文件相关属性:可改用 ...
- iOS 视图控制器的方法执行顺序
1 alloc 视图开始创建时, 需要开辟一个新的内存空间, 这时就需要alloc申请一块新的内存空间. 2 init 初始化视图. 3 ViewLoad, ViewDidLoad 通过英文 ...
- 25个增强iOS应用程序性能的提示和技巧 — 中级篇
本文由破船译自:raywenderlich 转载请注明出处:BeyondVincent的博客 _____________ 在开发iOS应用程序时.让程序具有良好的性能是非常关键的.这也是用户所期望的. ...
- iOS 无限后台运行
2019独角兽企业重金招聘Python工程师标准>>> 根据苹果文档中关于后台执行的描述,任何app都有10分钟左右的后台任务执行时间. 10分钟后,app会被iOS强行挂起. 但是 ...
- IOS可执行文件学习总结
了解iOS上的可执行文件和Mach-O格式 http://www.cocoachina.com/mac/20150122/10988.html 很多朋友都知道,在Windows上exe是可直接执行 ...
- Reveal:分析iOS UI该武器
Reveal是分析iOS应用UI的利器: Reveal可以在执行时调试和改动iOS应用程序.它能连接到应用程序,并同意开发人员编辑各种用户界面參数.这反过来会马上反应在程序的UI上.就像用FireBu ...
- iOS逆向之hook框架frida的安装和使用
一.Frida 利用 Hopper.class-dump.ios-ssl-kill-switch.Keychain-Dumper.MachOParser 可以进行静态分析. 使用 CycriptTri ...
最新文章
- 《适用于初学者的 Python》
- python长度分割文本_python 按照固定长度分割字符串的方法小结
- linux内存显示3.54g,为什么WDCP/linux服务器内存一直显示几乎用完了
- 小能量汇聚成大能量_清体能量棒配料解析:小种子,大能量,藜麦和青稞
- 《Leetcode | 02》
- 我做技术的这十年,我不做技术的这一年~
- 东南大学成贤c语言试卷,成贤高数(下)期中试卷参考答案
- php算法结构,PHP数据结构与算法:顺序表
- python 菜鸟-Python3 面向对象
- MVVM开发模式MVVM Light Toolkit
- 【转】SQLServer2005中的增强数据类型VARCHAR(MAX)
- 基于树莓派的人脸识别门禁系统
- 语言代号/地区代号/国家代号
- win10无法正常弹出移动硬盘/U盘
- python 等值面_ANSYS Fluent快速添加等值面/等值线 源代码-教育代码类资源
- STM32常用的开发工具有哪些?
- 推荐的这22个高频 CLI 工具,确定不收藏吗?
- openjudge白细胞计数
- 格与布尔代数(笔记)
- oracle CLOB与BLOB的区别及使用
热门文章
- redis 缓存预热_Redis异常问题解决方案:缓存雪崩、预热、穿透、击穿、降解方案分析...
- 战队不显示名字了_年仅17岁的新人选手!峡谷之巅1200分!被16家战队哄抢
- 多线程(thread)+进程(Process)
- Java中重定向,转发深入理解 2021-04-26
- mysql sync es 异步双写_mysql数据同步es方案思考
- html5与python哪个好_3个原因告诉你,为什么选择HTML5大前端?
- python 参数收集_Python参数传递及收集机制原理解析
- html剧场座位设计图,如何设计剧院座位,21个细部案例
- 云服务器更换系统后tomcat,如何对云服务器装tomcat
- 计算机级用英语怎么说,计算机国家一级用英语怎么说