记,NSProxy需要实现哪些方法?
转注出:https://www.cnblogs.com/xiaobajiu/p/10799962.html
使用NSProxy做替身,代理,多继承,本质上都是用它来转发消息给真身。
观察头文件,NSProxy自身实现了的方法如下:
+ (Class)class;//类方法不应该重写
//普通消息转发1
- (void)forwardInvocation:(NSInvocation *)invocation;//其实自身并没有实现,调用报错。需要子类实现。并且官方建议重写。
//普通消息转发2
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel;//可以重写,并且官方建议重写。
- (void)dealloc;//可以重写
- (void)finalize;//应该忽略的方法(垃圾回收)
@property (readonly, copy) NSString *description;//可以重写
@property (readonly, copy) NSString *debugDescription;//可以重写
+ (BOOL)respondsToSelector:(SEL)aSelector;//类方法不应该重写
另外值得注意的是被注释的快速转发消息方法:
// - (id)forwardingTargetForSelector:(SEL)aSelector;
官方明确的暗示我们要使用上上方代码块里的普通消息转发。其实NSproxy子类对象是响应这个方法的,探究这行注释的原因主要是因为协议<NSObject>
- (BOOL)isEqual:(id)object;//可以重写,内部只比较地址没比较哈希
@property (readonly) NSUInteger hash;//可以重写 @property (readonly) Class superclass;//可以重写
- (Class)class;//可以重写
- (instancetype)self;//可以重写,一般忽略 - (id)performSelector:(SEL)aSelector;//可以重写
- (id)performSelector:(SEL)aSelector withObject:(id)object;//可以重写
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;//可以重写 - (BOOL)isProxy;//返回YES,一般忽略 - (BOOL)isKindOfClass:(Class)aClass;//被主动转发到自身的forwardInvocation:中处理
- (BOOL)isMemberOfClass:(Class)aClass;//被主动转发到自身的forwardInvocation:中处理
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;//被主动转发到自身的forwardInvocation:中处理 - (BOOL)respondsToSelector:(SEL)aSelector;//如果不能响应也会被主动转发到自身的forwardInvocation:中处理 - (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE; - (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; @property (readonly, copy) NSString *description;//可以重写
@optional
@property (readonly, copy) NSString *debugDescription;//可以重写
这里注意到了4个很特殊的方法:
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol; - (BOOL)respondsToSelector:(SEL)aSelector;
前3个方法直接要求使用普通消息转发来实现,所以一调用就跳进普通消息转发从而绕开了快速转发(- (id)forwardingTargetForSelector:(SEL)aSelector;)
NSProxy并没有实现forwardInvocation:如果用户也没有实现的话它一定会产生崩溃。同理,末尾方法如果自身不能响应依然会要求使用普通消息转发来实现。
第一个总结:
如果在NSProxy中只想使用快速转发来完成功能的话就:1.必须单独实现以上4个方法,或者2.既实现快速转发又实现普通转发;显然1比较划算。
第二个结论:
如果要极尽完全地实现把所有消息都转发给内部的真身,那么应该要把上方标记'可以重写'的方法都重写了。
记,NSProxy需要实现哪些方法?的更多相关文章
- 记一次使用utl_http方法调用接口,报字符或值错误
背景:ebs系统和其他系统通过utl_http包调用接口,使用log方法记录日志. 某次调用接口,执行到记录日志行报字符或值错误. 查找原因,发现是p_str的长度超过的32767的限制. 解决办法: ...
- Linux--忘记MySQL密码的解决方法和输入mysqld_safe --skip-grant-tables &后无法进入MySQL的解决方法
https://blog.csdn.net/qq_35389417/article/details/78910974
- Js toString()方法笔记
一.前言 toString()用于将该对象以字符串(string)的形式返回,该方法属于Object对象;也就是说对象都能够使用此方法. 之前所接触的是array.toString()数组转换为字符串 ...
- 【笔记】让DIV水平垂直居中的两种方法
今天写的了百度前端学院春季班的任务:定位和居中问题 由于距离上次学习CSS有点久远了,加上以前木有记笔记的习惯,方法忘得只剩下一种,今天通过网上查阅资料总结了以下两种简单的方法让DIV水平垂直居中. ...
- 记SCOI2019
离精英体验营结束已两周的,要哭的要笑的现在也一定释怀了.是时候冷静分析一下这次的考试了.时间序虽然有流水账的嫌疑,但这毕竟是OI界的流行风气. day0 早上坐学校包的商务车去了电子科技大学.走在来过 ...
- js字符串和数组操作,容易混淆的方法总结(slice、substring、substr、splice)
平时工作中,很少静下心来总结基础知识,总觉得自己会用了,有点飘了,直到碰壁之后才懂得基础知识的重要性.大牛告诉我,一次写对,是不是可以不用F12去调试了?是不是省了时间?简直是面红耳赤,无地自容.在这 ...
- JavaScript去除空格的三种方法(正则/传参函数/trim)
方法一: 个人认为最好的方法.采用的是正则表达式,这是最核心的原理. 其次.这个方法使用了JavaScript 的prototype 属性 其实你不使用这个属性一样可以用函数实现.但这样做后用起来比较 ...
- 启动tomcat服务器自动执行一个方法
第一步:配置web.xml文件 添加如下代码 <servlet> <servlet-name>Timer</servlet-name> <servlet-cl ...
- 010-Spring aop 001-核心说明-拦截指定类与方法、基于自定义注解的切面
一.概述 面向切面编程(AOP)是针对面向对象编程(OOP)的补充,可以非侵入式的为多个不具有继承关系的对象引入相同的公共行为例如日志.安全.事务.性能监控等等.SpringAOP允许将公共行为从业务 ...
随机推荐
- 基于jquery的弹幕实现
前几天,需要做一个弹幕展示效果,看了网上很多资料,但是很不凑巧,都不能满足自己的需求和功能点,但是总不能放弃吧,那么就自己写一个,今天把成果分享给大家,首先说一下市面上比较流行的弹幕插件吧: 1.有关 ...
- HotStuff共识协议详解
1. 前言 HotStuff提出了一个三阶段投票的BFT类共识协议,该协议实现了safety.liveness.responsiveness特性.通过在投票过程中引入门限签名实现了O(n)的消息验证复 ...
- IOS开发中制作属于自己的静态库.a、资源库.bundle、.framework
一.什么是库 库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库. 静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复 ...
- Evevt Loop 事件循环
目录 JavaScript 是一门单线程的语言 一.什么是event Loop的执行机制 练习 异步任务-setTimeout 练习1: 练习2: 练习3: 练习4: 二 事件队列作用 同步任务 例1 ...
- 2018HDU多校训练一 K - Time Zone
Chiaki often participates in international competitive programming contests. The time zone becomes a ...
- 记录我的 python 学习历程-Day06 is id == / 代码块 / 集合 / 深浅拷贝
一.is == id 用法 在Python中,id是内存地址, 你只要创建一个数据(对象)那么就会在内存中开辟一个空间,将这个数据临时加载到内存中,这个空间有一个唯一标识,就好比是身份证号,标识这个空 ...
- margin重叠与穿透问题
margin重叠是指两个同级元素之间.margin穿透指的是,子元素margin超出父元素而未被父元素包含的现象. 出现margin重叠的原因: 同一个BFC里面两个块级元素会出现margin折叠. ...
- 常用eslint配置
"off"或者0 //关闭规则关闭 "warn"或者1 //在打开的规则作为警告(不影响退出代码) "error"或者2 //把规则作为一个 ...
- ES6中export default与export的区别
1.export default 和export都可以用于导出常量,函数,文件,模块等: 2.可以在模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使 ...
- 《Java基础知识》Java成员变量,成员方法,构造方法和析构方法
一 成员变量 成员变量是指类的一些属性定义,标志类的静态特征,它的基本格式如下: [访问修饰符][修饰符][类型][属性名称]= [初始值] 访问修饰符:public(公共的):protected(受 ...