Iphone [super ViewWillDisplay]的功能是什么,何时需要它?

Iphone [super ViewWillDisplay]的功能是什么,何时需要它?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,是[超级视图将出现]总是必需的?如果没有,何时以及为什么使用它?首先,正确的锅炉板应为: -(void)viewWillAppear:(BOOL)animated{ //something here [super viewWillAppear]; } 换言之,先调用super,然后做你自己的事情。您必须将animated参数传递给super 您通常希望在任何方法中首先调用超类的实现。在许多语言中,这是必需的。在Objective-C中不是,但是如果你不把它放在方法的顶端,你很容易遇到麻烦。(也

[超级视图将出现]总是必需的?如果没有,何时以及为什么使用它?

首先,正确的锅炉板应为:

-(void)viewWillAppear:(BOOL)animated{
//something here
[super viewWillAppear];
}
换言之,先调用
super
,然后做你自己的事情。您必须将
animated
参数传递给
super

您通常希望在任何方法中首先调用超类的实现。在许多语言中,这是必需的。在Objective-C中不是,但是如果你不把它放在方法的顶端,你很容易遇到麻烦。(也就是说,我有时会打破这种模式。)

是否需要调用
super的
实现?在这个特定方法的情况下,如果不调用它,您可能会得到意外的行为(特别是如果您已经子类化了
UINavigationController
)。因此答案是否定的,不是从技术角度来说,但你可能应该一直这样做


但是,在许多其他方法中,可能有很好的理由不调用
super

根据我的经验,在调用
reloadData
之后,在第一行调用
[super view willbeen]
会使从详细视图返回时无法检索以前选择的行。当最后一句话是
[super view willbeen]
时,您可以获取所选行并显示以前所选行的提示。只有在使用
[tableView reloadData]
内部
视图时才会出现这种情况

假设您有两个类,一个父类和一个子类。子对象从父对象继承。它们有一个名为greet的方法,该方法返回一个字符串

下面是父方法的外观:

代码:

我们希望孩子向父母学习。所以我们用super来表示问候,妈妈会怎样问候,但我们自己也有一些补充

代码: //继承自父项

-(NSString *)greet {
   return @"Hello";
}
所以现在,父母打招呼“你好”,孩子打招呼“你好,妈妈”。稍后,如果我们将家长的问候改为“嗨”,那么这两个班级都会受到影响,你会有“嗨”和“嗨,妈妈”


super用于调用超类定义的方法。它用于访问已被子类重写的方法,以便类可以围绕其父类实现的方法包装自己的代码。如果您正在执行任何类型的继承,它都非常方便。

调用
super
方法提供了在父类中执行代码的可能性

关于你的问题根据


所以,是的,这个方法是必需的。

这里有一个反例:当重写dealloc时,您必须在完成所有的释放后调用super,否则您几乎肯定会崩溃。所以我想事实是,正确的调用顺序取决于上下文,这并不理想。是的,Felixyz,但这是一个简单的规则:让超级构建先行,让超级拆除最后。我还应该提到:我今天大部分时间都在跟踪armv6设备上的崩溃,该崩溃通过调用
[超级视图将出现]
按正确的顺序。我以前从未见过这种物质,但如果它曾经起作用的话,可能还有其他地方也起作用。@Steven:Yikes。你知道坠机的确切原因吗?我看到了问题所在。人们不知道为什么他们称之为super的ViewWill会出现,他们只是认为既然书上说要这样做,我们就应该这样做。首先,您必须知道谁是您的超级用户,在调用它之前,它的viewwillbeen实现会做什么。是的,因为您的超级用户的viewwillbeen(您是其中的实现者)可能正在进行一些UI初始化。此修复了iOS9特定的问题-“NSInternalInconsistencyException”,原因:“未设置UITableView数据源”。在重新加载数据期间,选中的行将被清除,您需要在重新加载之前捕获选中的行,然后在重新加载之后再次设置它们。UITableViewController视图将仅在tableView.numberOfSections为零时显示调用重新加载。
-(NSString *)greet {
   return @"Hello";
}
-(NSString *)greet {
  NSString *parentGreeting = [super greet];
  return [parentGreeting stringByAppendingString:@", Mommy"]
}