小编Yur*_*nko的帖子

编译器找到[super msg]时会发生什么?

我已经从使用objective-c的编程中读到了苹果的"消息传递"章节,并得到了关于self和super的几个问题.AFAIK当编译器发现任何消息时,它将其转换为带有两个隐藏参数的objc_msgSend - 接收器,选择器和选择器的变量参数.例如[self test]将是这样的:

objc_msgSend(self, @selector(test));
Run Code Online (Sandbox Code Playgroud)

如果接收者的调度表中没有方法实现,那么函数将尝试在超类中查找实现.super只是编译器开始在当前对象的超类中搜索方法实现的标志,并且在文档中,apple说当编译器找到'super'时,它会将其转换为类似的东西:

struct objc_super mySuperClass = {
    self,
    [self superclass]
};
objc_msgSendSuper(&mySuperClass, @selector(forwardedMethod));
Run Code Online (Sandbox Code Playgroud)

我创建了一个包含3个类的项目,每个类都继承自另一个类.

@interface FirstClass : NSObject
- (void)forwardMethod;
@end

@interface SecondClass : FirstClass
@end

@interface ThirdClass : SecondClass
@end
Run Code Online (Sandbox Code Playgroud)

我在根视图控制器中创建了第三个类的实例,并调用了他的方法"forwardMethod".实施:

//First Class
- (void)forwardMethod {
   NSLog(@"Base class reached");
}

//SecondClass imp
- (void)forwardMethod {
   NSLog(@"second class");
   [super forwardMethod];
}

//ThirdClass imp
- (void)forwardMethod {
   NSLog(@"third class");
   [super forwardMethod];
}
Run Code Online (Sandbox Code Playgroud)

一切正常.但后来我决定解释编译器:

//First Class
- (void)forwardMethod {
   NSLog(@"Base class reached");
}

//SecondClass imp …
Run Code Online (Sandbox Code Playgroud)

objective-c super

6
推荐指数
1
解决办法
585
查看次数

标签 统计

objective-c ×1

super ×1