首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一个类别中调用super和在一个子类中调用它是相同的吗?

在一个类别中调用super和在一个子类中调用它是相同的吗?
EN

Stack Overflow用户
提问于 2011-05-29 21:45:01
回答 3查看 3.8K关注 0票数 12

在类别中调用[super init]是否与在子类中做相同的事情?如果不是,有什么不同?

EN

回答 3

Stack Overflow用户

发布于 2011-05-29 21:52:31

不,他们做了不同的事情。想象一下这样的类结构:NSObject => MyObject => MySubclass,假设您在MyObject上有一个名为MyCategory的类别。

现在,从MyCategory调用类似于从MyObject调用,因此super指向NSObject,而调用[super init]则调用NSObject-init方法。但是,从子类super调用MyObject,因此使用<代码>d14进行初始化将调用MyObject-init方法,该方法的行为与d17的不同。

这两种行为是不同的,所以在使用类别进行初始化时要小心;类别不是子类,而是对当前类的添加。

票数 8
EN

Stack Overflow用户

发布于 2011-05-29 21:54:32

在下面的示例中,super将调用UIView init (而不是UINavigationBar init方法)

代码语言:javascript
复制
@implementation UINavigationBar (ShadowBar)
- (void)drawRect:(CGRect)rect {
    //draw the shadow ui nav bar
    [super init];
}
@end

如果您将其子类化,[super init]将调用UINavigationBar初始化方法。

所以,是的,如果你要在UINavigationBar init中做一些额外的事情(额外的来自UIView),它们会做不同的事情。

票数 2
EN

Stack Overflow用户

发布于 2011-05-29 22:08:04

编辑:以下内容建立在一个有缺陷的前提下,请看josh的回答。

不删除,这仍然是一个有趣的参考,因为它可能会让你误入歧途。

它们是一样的..。在没有引用任何外部讨论的情况下,我们可能会有你说我应该……“用学术答案回答学术问题”。

代码语言:javascript
复制
@implementation categoryTestViewController (ShadowBar)
- (void)viewDidAppear:(BOOL)animated {
    //draw the shadow ui nav bar
    NSLog(@"super's class = %@, self's class %@",[super class],[self class]);
    if ([self class] == [super class]) {
        NSLog(@"yeah they are the same");
    }
}
@end

输出:

代码语言:javascript
复制
2011-05-29 08:06:16.198 categoryTest[9833:207] super's class = categoryTestViewController, self's class categoryTestViewController
2011-05-29 08:06:16.201 categoryTest[9833:207] yeah they are the same

调用超级viewDidAppear:将导致不调用任何内容...不是循环,所以我不知道它到底在那里做什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6168058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档