Objective-C中的SUPER是什么 - iOS

3

我有一个小问题,关于xcode中的super是什么意思。比如说我有下面这段代码。如果在dealloc方法中先调用[super dealloc],它会起作用吗?或者说super总是应该放在最后面吗?super到底是什么-我知道它是超类,但它是父类还是?

这是该类的.h文件

@interface TwitterTableViewController : PullRefreshTableViewController<TweetDelegate>

这是上述接口的.m类中的一些代码

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
    // Custom initialization
}
return self;
}

- (void)dealloc
{

[self.twitterManager release];
[tweets release];
[lastRefreshedLabel release];
[super dealloc];

我已经查看了所有相关资料,但是仍然没有一个令人满意的解释。如果有人能用通俗易懂的语言解释一下这个问题,那就太好了。谢谢!


如果您熟悉其他编程语言,可以将其视为“父级”。 - Bot
3
这不是一个简单的问题,而是一个重要的问题。在进行应用程序开发之前,我建议您确保熟悉Objective-C。 - Mark Leonard
6个回答

5

super调用PullRefreshTableViewController的实现。在您的情况下,这将是PullRefreshTableViewController

关于在自己的代码之前/之后调用super,这取决于您通过重写方法想要实现什么。

dealloc的情况下,请参阅此问题,如Nick Bull所提到的那样。


6
绝对不能用于dealloc!应该将其放在最后,否则在释放其余的实例变量之前调用[super dealloc]会一直返回到NSObject。 - jrturton
好的,试一下看会发生什么! - jrturton
@ErikAigner 请查看这个答案 https://dev59.com/6XNA5IYBdhLWcg3wkuzO - Nick Bull

3
超类可以被视为“父类”,如果你这么说的话。[super dealloc]调用当前对象的超/父类的dealloc方法的实现(如果你从一个类方法中调用它,则调用类的dealloc方法)。
但是,并没有规定“super必须总是最后出现”。dealloc必须始终出现在最后的原因是它销毁了对象,所以如果在返回后访问对象,程序将崩溃。

2

除了现有的答案外,本回答中的信息可能会帮助您决定何时调用 "super"。

在创建/初始化子对象/视图/视图控制器时,第一件事是调用 super(如果您想要调用它)。

当销毁/移除子对象/视图/视图控制器时,在方法末尾调用 super。

例如:

// methods called when the you are loading/showing with the view controller
    -(void)viewDidLoad {
        [super viewDidLoad];
        //call super and then all your code goes here
    }

    -(void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        //call super and then all your code goes here
    }

// methods called when the you are done with the view controller
    - (void)viewWillDisappear:(BOOL)animated{
        //all your code goes here and then call super
        [super viewWillDisappear:animated];
    }
    - (void)viewDidUnload {
        //all your code goes here and then call super
        [super viewDidUnload];
    }

同样地,对于-dealloc方法,super会在最后被调用,而对于-init方法,super会在最开始被调用。
希望这能让Super更加易懂。

1

super代表超级对象/也就是你正在实现的类所继承的父类

在你的情况下,它是一个PullRefreshTableViewController

这种行为是所有面向对象语言的基础,比如obj-c。

在你分析的情况下,超类有一个叫做的方法

 -(UITableviewStyle *) initWithStyle:style

那么在上述情况下,我可以这样说 - (void)dealloc { [super dealloc]; [self.twitterManager release]; [tweets release]; [lastRefreshedLabel release];} - CodeGeek123
3
不行,你不能这样做。在dealloc的结尾必须调用[super dealloc]。请参考Erik答案中@jrturton的评论。 - Nick Bull
4
不要在dealloc方法的自己的实现中调用[super dealloc],要等到自己实现结束后再调用。可以参考H2C03的回答。 - jrturton
1
哎呀,是的,抱歉我没有仔细阅读 :p 在deallc方法中,[super dealloc]始终是您不想调用的最后一件事。 - holographix

1

super指定消息应发送到当前类的父类(superclass)。由于您从PullRefreshTableViewController继承,因此消息将被发送到该类。


1

super 是父类,这里是 PullRefreshTableViewController。调用 [super dealloc],如果你需要实现自己的dealloc方法,你应该总是这样做,这允许你的父类(和它的父类,等等)在自己清理后进行清理。通常最好先执行自己的释放,然后让父类执行相同操作,因为您永远无法确定父类将从您的脚下扫掉什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接