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

iOS runtime探究(二): 从runtime开始深入理解OC消息转发机制你要知道的runtime都在这里

NSNumber找不到appendString:方法,就会报错。...)((id)p, sel_registerName("setName:"), (NSString *)&__NSConstantStringImpl__var_folders_1f_dz4kq57d4b19s4tfmds1mysh0000gn_T_main_f5b408...同样的也可以简写为如下代码: //这一行是用来查找参数的地址,取名为name (NSString *)&__NSConstantStringImpl__var_folders_1f_dz4kq57d4b19s4tfmds1mysh0000gn_T_main_f5b408...[num appendString:@"Hello World"]; 前文介绍了进行一次发送消息会在相关的对象中搜索方法列表,如果找不到则会沿着继承树向上一直搜索知道继承树根部(通常为NSObject...:(SEL)name,当找不到相关实例方法的时候就会调用该类方法去询问是否可以动态添加,如果返回True就会再次执行相关方法,接下来看一下如何给一个动态添加一个方法,那就是调用runtime库中的class_addMethod

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

OC-从方法的汇编层看消息转发流程

JumpMiss //jumpmiss 内存没有命中会有三种不同的处理方式 走三种不同的函数 .if $0 ==GETIMP b GetImpMiss .elseif $0 ==NORMAL b...__objc_msgSend_uncached .elseif $0 == LOOKUP b __objc_msgLookup_uncached GetImpMiss: mov p0,#0 ret //...返回空值 END ENTRY _cache_getImp 注释:mask | bucket 中 mask处于高16位,bucket处于低48位 如果缓存找不到该方法调用 LookupImpOrForward...二分查找从isa-superclass 从-元-跟元逐步查找 如果还是无法找到报出一个经典的错误 unregized selector sent to instance objc_msgSend_uncatched...二·容错 LookupImpOrForward { 1.继续从缓存里查看该imp是否存在在缓存里,有可能是因为多线程调用导致找不到该sel imp = cache_getImp

86270

python自动脚本的pyautogui入门学习

本文介绍了pyautogui入门学习,分享给大家,也给自己留个笔记 安装 pip install pyautogui 学习使用 加载模块 import pyautogui 获取信息 电脑屏幕的左上角是位置..., currentMouseY = pyautogui.position() 进行操作 鼠标 # 鼠标移动到屏幕中心 pyautogui.moveTo(screenWidth / 2, screenHeight...() # 鼠标左键抬起 pyautogui.mouseUp() # 鼠标滚轮上滚10 pyautogui.scroll(10) # 鼠标滚轮下滚10 pyautogui.scroll(-10) 键盘..., interval=0.25) # 键入 "a", 然后敲击左方向键, 再键入 "b". pyautogui.typewrite(['a','left','b']) # 按键 pyautogui.press..., ‘@’, ‘[‘, ‘\’, ‘]’, ‘^’, ‘_’, ‘`’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’,‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’,

2.1K50

ios OC swift run-time isa 指针

)结构体的指针,而id是一个指向objc_object(对象)结构体的指针。...作用: 当我们调用某个对象的对象方法时,它会首先在自身isa指针指向的objc_class()的methodLists中查找该方法,如果找不到则会通过objc_class()的super_class...指针找到其父,然后从其methodLists中查找该方法,如果仍然找不到,则继续通过 super_class向上一级父结构体中查找,直至根class; 当我们调用某个方法时,它会首先通过自己的isa...指针找到metaclass(元),并从其methodLists中查找该类方法,如果找不到则会通过metaclass(元)的super_class指针找到父的metaclass(元)结构体,然后从...methodLists中查找该方法,如果仍然找不到,则继续通过super_class向上一级父结构体中查 找,直至根metaclass(元); 这里有个细节就是要说运行的时候编译器会将代码转化为objc_msgSend

67630

iOS - xcode经常报的经典error解决办法大全

4.错误信息: linker command failed with exit code 1 (use -v to see invocation) 错误原因:命名了两个相同名字的或者找不到.m文件,...在showInFinder里有,但是左侧栏没有导入。 2.m文件被误删了 3.引入第三方库的时候.m文件没添加进去编译!或framework没添加进去。 9....库未加 (3).文件路径缺失,检查是否某些文件路径未加入进来或者写错了 工程编译报出:Undefined symbols for architecture i386:和"_OBJC_CLASS_$_...nib but the view outlet was not set.‘ 查书才知道,没有做nib文件到xxxViewControler程序的关联,特此记录下来: 做法1: a, 打开nib文件 b,...原因:找不到某个framework或文件 办法:看no such file后面的东西是什么,一可能是找不到framework,二可能是找不到文件。

2.6K80

【已解决】Framework 框架需要引入工程里面

如果把改过的代码进行编译,一定会抱错的,因为找不到对应的文件。 首先想到就是 __has_include这个判断 如果工程里面有这个,就去执行对应的方法。...Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_ViewController", referenced from: objc-class-ref...这个不是运行时才检测的,所以在 Framework 进行编译打包的时候已经找不到头文件。所以那样写也不正确吧。...一调用就报找不到文件。 群里面大神让我执行下面命令 lipo -info xxx 查看是否支持模拟器框架,但是竟然查询不出来。 ?...B93F5CB1-67A6-4117-BC9C-5DC018A8B1CE 我突然想起来了,是不是编译选择了真机。 去看了一下果然是 Xcode 默认选择了真机,所以刚才编译出来的就只能真机才能用。

1.1K30

runtime

isa; } *id; 这段代码 5、objc_class Objective-C 中 NSObject是大多数的根。...protocols:需要遵守的协议。 6、objc_object objc_object 只有一个指向的 isa 指针,就是我们说的术语 “isa pointer”(isa 指针)。...所以这个实现了一个缓存,当你搜索一个的分发表,并找到合适的 selector 后,就会把它放进缓存中。所以当 objc_msgSend() 在一个中查找 selector 时会先查找缓存。...1、去obj的对应的中找方法 2、先找缓存,找不到再去找方法列表, 3、再找父,如此向上传递。 4、最后再找不到就要转发。...http://www.jianshu.com/p/04ba5f3bfc2b 6、消息机制方法调用流程 方法:实例方法,方法 http://www.jianshu.com/p/d5ca2cdd4fa7

64920

RunTime 之消息处理与消息转发

sel_registerName("setName:"), (NSString *)&__NSConstantStringImpl__var_folders_1f_dz4kq57d4b19s4tfmds1mysh0000gn_T_main_f5b408...当你调用一个的方法时: (1)先在本类中的方法缓存列表中进行查询,如果在缓存列表中找到了该方法的实现,就执行, (2)如果找不到就在本类中的方列表中进行查找。...当在相应的以及父找不到方法实现时会执行+resolveInstanceMethod:这个方法。该方法如果在中不被重写的话,默认返回NO。...在该方法中,我们可以为找不到实现的SEL动态的添加一个方法实现,添加完毕后,就会执行我们添加的方法实现。这样,当一个调用不存在的方法时,就不会崩溃了。...该方法会返回一个的对象,这个的对象有SEL对应的实现,当调用这个找不到的方法时,就会被转发到SecondClass中去进行处理。这也就是所谓的消息转发。

69520

iOS消息机制相关

objc向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系? objc_msgSend()是[obj foo]的具体实现。...在动态编译时,[obj foo]会被转意为:objc_msgSend(obj, @selector(foo)) 先去obj对应的中找方法;找缓存,找不到时去找方法列表;再找父,以此向上传递;最后找不到则转发...调用某个对象方法时,当前中无此方法,那么去父查找,向上直到NSObject。若依旧找不到,则会报此错误。 若没有实现某个方法时,会调用_objc_msgForward进行方法转发。...在崩溃前,objc运行时会给出三次拯救崩溃的机会 +(bool)resolveInstanceMethod:(sel){ //第一次找不到时,会自动调用该方法,用来给程序添加一个新方法并执行 } -...objc方法与实例方法的本质区别以及联系 方法: 方法属于对象; 方法只能通过对象调用; 方法中的self是对象; 方法中不能访问成员变量; 方法可以调用其他的方法; 方法中不能直接调用对象方法

1.4K40

NSObject头文件解析 消息机制 Runtime解读 (一)

objc_ivar_list *ivars: 的成员变量列表 可以用class_copyIvarList()来获取 objc_method_list **methodLists: 的方法列表 可以用...3.如果上面两个都过了,那就开始查找这个的 IMP,先从 cache 里面找,完了 找得到就跳到对应的函数去执行。 4.如果 cache 找不到就找一下方法表。...5.如果方法表找不到就到超/父的方法表去找,一直找,直到找到NSObject为止。...(也可以还带有参数), 对象接收到消息后会先在cache中找之前的调用记录, 在调用记录中找到了该方法就直接运行, 找不到就去方法列表去找 还找不到就去父去找 如果找到顶层还是没有, 一般情况下在我们没有进行任何操作的时候会...2017-02-02 16:21:19.010 RunTimeDemo[671:13108] Print B 2017-02-02 16:21:19.020 RunTimeDemo[671:13108]

1.2K31

Python中的内置异常你知道那些,欢迎留言评论~~~

Python中的所有实例必须是从BaseException派生的的实例。通过子类不相关的两个异常,即使它们具有相同的名称,也永远不会等效。内置异常可以由解释器或内置函数生成。...基 以下异常通常用作其他异常的基。 1、exception BaseException 这是所有内置异常的基。它并不意味着被用户定义的直接继承。对于用户定义的,使用Exception。...5、exception LookupError 这是在映射或序列上使用的键或索引无效或找不到时引发的那些异常的基。...for i in range(1, a+1): MemoryError 异常NameError 如果找不到本地或全局名称,则会引发此错误。...当派生覆盖该方法时,用户定义的中的抽象方法应引发此异常。

2.9K10
领券