You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@interface Grandparent : NSObject
- (void) One;
@end
@implementation Grandparent
- (void) One { NSLog(@"Grandparent One\n"); }
@end
@interface Parent : Grandparent
- (void) One;
- (void) Two;
@end
@implementation Parent
- (void) One { NSLog(@"Parent One\n"); }
- (void) Two
{
[self One]; // will call One based on the calling object
[super One]; // will call One based on the defining object - Parent in this case so will Grandparent's One
}
@end
@interface Child : Parent
- (void) One;
@end
@implementation Child
- (void) One { NSLog(@"Child One\n"); }
@end
void testSelfSuper() {
Child *c = [Child new];
[c Two]; // will call the Two inherited from Parent
Parent *p = [Parent new];
[p Two]; // will call Parent's Two
}
输出的结果是:
Child One
Grandparent One
Parent One
Grandparent One
用 clang 讲上面的代码重写成 C++ 代码后,Parent 中的 [super One]; 会被转换成下面的代码:
所以,我们是否可以得出这样的结论:JSPatch 中的 self.super() 并不能完全等同于 Objective-C 中的 super 来使用?
The text was updated successfully, but these errors were encountered:
ShannonChenCHN
changed the title
关于 “super关键字” 的一点疑问(Some thoughts on the implementation of self in JSPatch)
关于 “super关键字” 的一点疑问(Some thoughts on the implementation of self.super() in JSPatch)
May 8, 2018
感谢 bang 哥分享了一个这么棒的框架!👏
在读 JSPatch-实现原理详解 时,看到有这样一段话:
但是,实际上 Objective-C 中对于 super 的实现并不是调用当前对象或者类对象(也就是 receiver)的父类的某个方法,而是调用
[super xxx]
代码所在类的父类的方法。我的理解是,
[self xxx]
要调用的实现是在运行时动态决定的,而[super xxx]
要调用的实现是编译时就确定了的。从下面用 clang 重写出来的 cpp 代码中也可以看出来,这其实是因为objc_msgSendSuper
函数的第一个参数objc_super
结构体中的 receiver 是通过接收方法中的 self 参数得来的,所以动态决定的,而objc_super->superClass
是通过class_getSuperclass(objc_getClass("Parent"))
得到的,所以是静态的,在编译时就确定了的。以下面的 Objective-C 示例代码为例,我测试了一下:
输出的结果是:
用 clang 讲上面的代码重写成 C++ 代码后,Parent 中的
[super One];
会被转换成下面的代码:然后我再通过 JSPatch 使用 JavaScript 实现上面的示例时,就出现了不一样的结果:
console 打印结果:
所以,我们是否可以得出这样的结论:JSPatch 中的
self.super()
并不能完全等同于 Objective-C 中的super
来使用?The text was updated successfully, but these errors were encountered: