首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

对象消息、运行期--12:runtime消息转发

消息转发 消息转发分为俩大阶段 动态方法解析 完整的消息转发机制 消息转发全流程: 若对象无法响应某个选择器,则进入消息转发流程 2.通过运行期间的动态方法解析,可以再需要用到某个方法时再将其加入类中...3.对象可以把其无法解读的某些选择器转交给其他对象处理 4.经过上述两步,如果还是不能处理选择器,那就启动完整的消息转发机制 消息转发全流程.png 动态方法解析(动态添加方法) 当一个实例对象调用一个不存在的方法...NSInvalidArgumentException', reason: '-[Phone say]: unrecognized selector sent to instance 0x600000005b90' 第一步:对象在收到无法解读的消息后...此时,我们需要找一个与Phone相关连的类去处理这个消息,如果这个相关联的对象可以处理这个消息,则返回这个对象,若不能则返回nil。...signatureWithObjCTypes:"v@:"]; } return [super methodSignatureForSelector:aSelector]; } //如果上面的方法签名找到了,则会调用这个方法.将消息传递给其他对象

15010

对象消息、运行期--11:runtime消息机制

消息机制 先来看看C语言使用的“静态绑定”,也就是在编译期就能决定运行时所调用的函数 void sayHi(){ NSLog(@"sayHi"); } sayHi(); 而在OC中使用的是“动态绑定...”,在程序编译时不能决定真正调用哪个函数,只有当程序运行时,编译器才会根据函数名去方法列表里找对应的函数,runtime运行时就是执行已经编译好的代码,OC通过runtime库把方法调用转化为“消息机制...”(动态消息派发系统),消息有“名称”和“选择器”,可以接受参数,而且可能有返回值 - (void)sayHI:(NSString *)str{ NSLog(@"say--%@",str); }...[self sayHI:@"HI"]; 在这段代码中: self:代表接收者,sayHI:代表选择器 ,选择器与参数合起来称为“消息”,编译器收到这个消息时,会将其转化为obj_smgSend函数,...void obj_smgSend(id object, SEL cmd,...) object:代表接收者,SEL:代表方法选择器,后续参数为消息中传的参数,顺序不变 这样上述的函数调用会转化为: id

13710
您找到你想要的搜索结果了吗?
是的
没有找到

对象消息、运行期--10:runtime关联对象

关联对象 给某个object关联一个或多个其他对象,这些对象通过“键”来区分,我们可以通过这个键给这个object绑定一个对象,也可以通过键获取objct绑定对象。...object身上的一个键就对应一个关联对象,所以我们可以给object关联多个对象。类似字典,把关联到object的值理解为字典中的value,这些value通过key来存取。...设置关联对象时用的键是个“不透明指针”,在设置关联对象时,若想让俩个键匹配到同一个值,则二者必须是完全相同的指针才行。鉴于此,存取关联对象用的key通常是一个静态全局变量。...(id object)函数移除的是某个对象身上的所有关联的对象。...objc没有给我们提供移除object身上单个关联对象的函数,所以,一般通过objc_setAssociatedObject函数传入nil来达到移除某个关联对象的目的。

17910

什么是好的错误消息?

错误信息是我们在线日常生活的一部分。每次服务器故障或没有网络,或忘记在表格中添加一些信息,我们就会收到错误信息。"出错了" 是常见的做尘。但是什么出错了?发生了什么?...所以这时候不是安可爱的时候。我们需要向用户表明,我们知道这是严重的,我们明白这对他们很重要。 Technical jargon 专业术语: 程序员喜欢把一些专业术语用在错误提示里面。...尽量把重点放在问题上,而不是导致问题的行动上。 Generic for no reason 太官方的说辞:比如「稍后尝试」。知道原因而不告诉用户,是不好的。...好的错误提示 图片 Say what happened and why: 说明出错的原因:让用户清楚的知道发生错误的原因,可以通过视觉和文字的结合来完成。解释用户为什么会出现这个错误。...即使是技术原因,也要说明是我们的原因,而不是用户操作错误。比如:「由于技术上的原因,暂时无法连接到你的账户」。 Provide reassurance 提供保证:比如「你的修改已被保存到草稿」。

1.5K30

英文阅读 | range对象不是迭代器

导读:昨天写了一篇《为什么range不是迭代器?range到底是什么类型?》,它跟之前两篇关于迭代器的文章是一脉相承的,所以我就没再介绍迭代器是什么,以及它跟可迭代对象有啥差别。...到了展示 range 不是迭代器的时候,也是简单带过。这引起某个论坛的小伙伴说我没抓住重点。 他是误会了。...我从头到尾所关心的重点就是两个问题:为什么 range 不是迭代器,range 是一种怎样的序列类型?...我基于这样的考虑:range 对象完全可以被设计成迭代器,如此仅仅会减少一些便利而已,并非是不能,所以怎么设计 range,这是一道选择题。 然后,就要说到今天分享的这篇文章了。

73740

如何编写有用的错误消息

用户需要在他们遇到问题时获得错误消息的帮助——所以这些消息最好是有用的。 因此,与其“编写”错误消息,不如考虑“构建”消息。...3构造错误消息 一旦你构建了一些基础,你就可以给你的错误消息建立一些结构。这样,所有错误消息就都会保持一致,永远都不会过于冗长。  你应该问自己三个关键问题: 谁触发了错误?...采取更直接的方法:“你需要恢复你的帐户”而不是“哎呀,你被锁定了!”,但告诉用户“我们随时为你提供帮助。” 平衡精度与一致性 在一个简单的表单上(比如用户注册页面),你需要考虑一些最常见的错误。...6写出好的消息的原则 根据项目的不同,你可能需要调整其中的一些想法。 它们并不是解决问题的一刀切原则。不同的情况需要不同的细节水平。需要根据用户测试和数据的情况来调整细节水平。...但是你可以遵循一些很好的原则,它们可以帮助你写出很出色的错误消息: 使用通俗易懂的语言:写出你会大声念出来的句子和单词 分解长句:两个短而清晰的句子比一个长句好 使用主动语态:应该说“输入你的姓名”,而不是

86510

消息队列:听我解释,我真的不是只有Kafka!

同时这类消息往往对时延的要求不是很高,比较适合采用消息队列暂存。 (四)小结 最后我们在对本节的内容做一个简单的总结,上面通过三个简单的实例介绍了消息队列的典型的三个使用场景:异步、解耦、削峰。...换个角度来理解可以看到,消息队列主要适用于处理对消息要求不是很实时,同时一份数据可能会多处使用的场景,不同的使用方处理速率不同。更多的消息队列的使用场景读者可以自行找资料阅读和总结。...它有借鉴Kafka的设计思想,但不是kafka的拷贝。 ...消息队列集群: 消息队列集群是消息队列这种组件实现中的核心中的核心,它的主要功能是存储消息、过滤消息、分发消息。...这个过程就绪通知,类似于推送,但推送的不是数据,而是数据就绪的信号。具体的数据获取方式还是需要通过拉取的方式来主动读。

34330

为什么Java不是纯面向对象语言?

什么是纯面向对象语言? --------- 纯面向对象语言或完全面向对象语言是指完全面向对象的语言,它支持或具有将程序内的所有内容视为对象的功能。...编程语言满足七种标准可以就可以称为纯粹的面向对象语言,他们是: 封装/数据隐藏 继承 多态性 抽象化 所有预定义类型都是对象 所有用户定义的类型都是对象对象执行的所有操作必须仅通过对象公开的方法 正是金九银十跳槽季...为什么Java不是纯面向对象语言? --------- Java支持属性1,2,3,4和6但不支持上面给出的属性5和7....Java语言不是纯面向对象语言,因为它包含以下属性: 原始数据类型例如对象 Smalltalk是一种“纯粹的”面向对象的编程语言,与Java和C++不同,因为作为对象的值和作为基本类型的值之间没有区别...因此,如果您不是用int Integer创建并对其执行任何数学运算,那么Java将仅使用基本类型int 。

1.1K40

WordPress上传图片错误:不是合法的JSON响应

最近在迁移WordPress到新服务器时遇到一个问题,就是在编辑文章上传图片时,会报错:此响应不是合法的JSON响应,经过多方验证,最后得出结论,是由于php的一些模块没有开启的原因,下面就详细讲一下,...一、错误审视 错误如下: 在通过古德温编辑器进行直接复制粘贴或者点击上传图片的时候会出现这个错误,先上传到媒体库再从媒体库添加则没有这个问题,因此,网上很多攻略都是说禁用古德温编辑器,或者安装经典编辑器插件...就在fastcgi的下面,取消; cgi.rfc2616_headers = 1的注释 取消后如图: 我们把修改好的php.ini文件复制一份,放到C盘的windows文件夹下 三、验证错误是否已经解决

23110

对象消息、运行期--8:对象等同性isEqual:、hash

对象等同性 对象的等同性 :我们在使用对象的时候,往往需要判断两个对象是否相等,这种相等包含两种含义: 在程序上是否是同一块内存地址 在语义上,是否能指代同一对象 NSString *str = @...0xa000000003332313 str == str1 : 1 str == str2 : 0 str isEqual str1 : 1 str isEqual str2 : 1 由此可见 ==:比较的是两个指针本身,而不是其所指的对象...- dic end ---------- NSSet添加新成员时, 需要根据hash值来快速查找成员, 以保证集合中是否已经存在该成员 hash 值的目的是尽最大可能返回一个标识,但并不是一定要是唯一的...- (NSUInteger)hash { return [_name hash] ^ _age; } 保证 hash 的不可变 我们在容器中使用对象时,要尽量避免对象 hash 值的不可变,或者说在将对象放入容器后不再改变对象的内容...,这样才能避免容器中出现错误的数据 Person *person1 = [[Person alloc] init]; person1.name = @"abc"; person1.age = 12

12910

02 - 并不是所有东西都是对象

const obj = { key: 'value' } 简而言之,不是原始类型的任何事物都是 Object,并且包括函数和数组。 所有的功能都是对象?...此外,与对象不同,原始类型作为值本身存储为对象,后者作为参考存储,这在执行相等性检查时会产生影响。...,这就像其他对象一样。...这也解释了为什么在尝试将属性分配给原始类型时JavaScript不抱怨的原因,因为赋值是在该临时包装对象上完成的,而不是原始类型本身。...JavaScript有6种原始类型 所有不是原始类型的东西都是对象 函数只是对象的一种特殊类型 函数可用于创建新对象 字符串,布尔值和数字可以表示为原始类型,也可以表示为对象 由于JavaScript

43510

“面向对象就是一个错误!”

1 前言 C++和 Java 可能是计算机科学领域最大的错误。就连面向对象的创建者 Alan Kay 都曾对这两门语言提出了严厉的批评。然而,C++和 Java 都是比较主流的面向对象语言。...然而,面向对象编程并不是我们一直在寻找的解决方案。它没有提供任何约束来帮忙解决代码扭曲纠缠的问题。...他希望有独立的程序(细胞)通过相互发送消息进行通信。独立程序的状态永远不会与外界共享(封装)。 AlanKay 从来也没想过让“细胞”直接进入其他细胞的内部做任何修改。...但现代面向对象编程就这么干了,因为在现代面向对象编程中,默认情况下,一切都是通过引用共享的。这也意味着破坏正常功能的错误无法避免。...14 现在就开始行动 面向对象编程本身就是一个巨大的错误。 如果我知道我乘坐的汽车运行的软件是由面向对象编程语言编写的,我会感到害怕;知道我和家人乘坐的飞机使用了面向对象的代码,也会让我感到不安。

46840

Android Handler机制5之Message简介与消息对象对象

好像很简单的样子,大家心里肯定感觉"咱们是不是忽略了什么?" 是的,既然官方是不推荐使用new Message的,因为这样可能会重新创建冗余的对象。所以我们推测大部分情况下sPool是不为null的。...第二步,spool = this,将当前这个message作为消息对象池中下一个被复用的对象。...第一步,判断sPool是否为空,如果消息对象池为空,则直接new Message并返回 第二步,Message m = sPool,将消息对象池中的对象取出来,为m。...第三步,sPool = m.next,将消息对象池中的下一个可以复用的Message对象(m.next)赋值为消息对象池中的当前对象。...从代码中可以看出大部分数据确实都是浅拷贝,但是对于data这个Bundle类型的成员变量却进行了深拷贝,所以说该方法是一个浅拷贝方法感觉也不是很贴切。

1.1K20

RocketMQ消息发送常见错误与解决方案

经过上面的步骤,基本就能解决该错误。 2、消息发送超时 ---- 消息发送超时,通常客户端的日志如下: ?...客户端报消息发送超时,通常第一怀疑的对象是RocketMQ服务器,是不是Broker性能出现了抖动,无法抗住当前的量。 那我们如何来排查RocketMQ当前是否有性能瓶颈呢?...在RocketMQ中通常遇到网络超时,通常与网络的抖动有关系,但由于我对网络不是特别擅长,故暂时无法找到直接证据,但能找到一些间接证据,例如在一个应用中同时连接了kafka、RocketMQ集群,发现在出现超时的同一时间发现连接到...根据上述5类错误日志,其触发的原有可以归纳为如下3种。...]broker busy 判断pagecache是否忙的依据就是在写入消息时,在向内存追加消息时加锁的时间,默认的判断标准是加锁时间超过1s,就认为是pagecache压力大,向客户端抛出相关的错误日志

5.8K21
领券