皮皮网
皮皮网

【java 源码学习】【服务电商源码】【溯源码足干】objc msgsend 源码

来源:his源码 发表时间:2024-11-27 10:37:14

1.为什么程序会在objc
2.self和super的区别

objc msgsend 源码

为什么程序会在objc

       ç¨‹åºå´©æºƒåœ¨objc_msgSend(),最有可能的原因是向一个已经释放的对象发送消息。

       å…¶ä»–的原因如下:

       1.也许你的指针是完全正确的,但是别的缺胳膊少腿的对象的内容可能是溢出在附近的一个分配的缓冲区。

       2. 或者使用重复的指针指向现在你的对象所占用的内存。

       3.极个别objc_msgSend()崩溃是因为内存被破坏,但通常的问题是在接收对象本身。

       è§£å†³é—®é¢˜çš„方法

       1. 找到接收消息的对象和转换器(selector )注册的所有对象。

       objc_msgSend()存储了receiver和the selector在cpu的寄存器中。不同的架构的cpu寄存器的名称不同

       objc_msgSend

       objc_msgSend_fpret objc_msgSend_stret

        receiver SEL receiver SEL

       i eax* ecx eax* ecx

       x_ rdi rsi rsi rdx

       ppc r3 r4 r4 r5

       ppc r3 r4 r4 r5

       arm r0 r1 r1 r2

       arm x0 x1 — —

       åœ¨è°ƒè¯•å™¨æŽ§åˆ¶å°ä¸­ï¼Œå½“程序停止时,打印无效地址,您可以打印上面的表中使用的寄存器名称的接收者的地址。

       ä»¥ä¸‹æ˜¯åœ¨Xcode 5.1连接ipad的结果

       (lldb) re r -f b r0

        r0 = 0b

       è½¬æ¢æˆè¿›åˆ¶

       (lldb) re r -f b r0 --format x

        r0 = 0xbcc

       å¯¹åº”çš„gdb的指令为

       (gdb) p/x $eax

        $1 = 0x1

self和super的区别

       è¦ç‚¹ï¼š

       self调用自己方法,super调用父类方法

       self是类,super是预编译指令

       ã€self class】和【super class】输出是一样的

       self和super底层实现原理:

       å½“使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找,然后调用父类的这个方法。

       å½“使用 self 调用时,会使用 objc_msgSend 函数: id objc_msgSend(id theReceiver,java 源码学习 SEL theSelector, ...)。第 一个参数是消息接收者,第二个参数是调用的具体类方法的 selector,后面是 selector 方法的可变参数。以 [self setName:] 为例,编译器会替换成调用 objc_msgSend 的函数调用,其中 theReceiver 是 self,theSelector 是 @selector(setName:),这个 selector 是从当前 self 的 class 的方法列表开始找的 setName,当找到后把对应的 selector 传递过去。

       å½“使用 super 调用时,会使用 objc_msgSendSuper 函数:id objc_msgSendSuper(struct objc_super *super, SEL op, ...)第一个参数是个objc_super的结构体,第二个参数还是类似上面的类方法的selector,

       struct objc_super {

        id receiver;

        Class superClass;

       };

       å½“编译器遇到 [super setName:] 时,开始做这几个事:

       1)构 建 objc_super 的结构体,此时这个结构体的第一个成员变量 receiver 就是 子类,和 self 相同。而第二个成员变量 superClass 就是指父类

       è°ƒç”¨ objc_msgSendSuper 的方法,将这个结构体和 setName 的 sel 传递过去。

       2)函数里面在做的事情类似这样:从 objc_super 结构体指向的 superClass 的方法列表开始找 setName 的 selector,找到后再以 objc_super->receiver 去调用这个 selector

相关栏目:焦点

.重点关注