[英]Objective-C: extending UIViewController leads to unexpected sense of “self” and “super”
假設我有一個UIViewController
@interface CustomController : UIViewController
@end
@implementation CustomController
- (void)myMethod {
//this is the problematic line. It calls viewDidLoad of ExtendedController
//but it should be calling viewDidLoad of CustomController
[self viewDidLoad];
}
- (void)viewDidLoad {
//and this line should call viewDidLoad from UIViewController
[super viewDidLoad];
}
然后我有另一個擴展了那個
@interface ExtendedController : CustomController
@end
@implementation ExtendedController
- (void)viewDidLoad {
[super myMethod];
}
啟動ExtendedController時,它將在ExtendedController中調用viewDidLoad,然后又調用CustomController的myMethod,然后再調用ExtendedController的viewDidLoad,這是一個無限循環。
我該怎么做,以便CustomController的myMethod始終在CustomController類而不是其他任何類中調用viewDidLoad。
這對我來說沒有多大意義,因為例如在Java中,此設置可以按預期工作。 但是以某種方式,在iOS中擴展類時,“自我”的概念丟失了。
public class Hello extends Omg {
public void myMethod() {
//in Java, this method does indeed call "viewDidLoad" in "Hello"
this.viewDidLoad();
}
public viewDidLoad() {
//in Java, this method does indeed call "viewDidLoad" in class "Omg"
super.viewDidLoad();
}
}
public class ExtendedHello {
public void viewDidLoad() {
super.viewDidLoad();
}
}
如何修復我的iOS代碼以獲得預期的行為?
更新:請注意,“ viewDidLoad”可以用任何方法名稱替換...此問題與它是viewDidLoad無關。
謝謝!
這正是在目標C中的工作方式。當您調用[self viewDidLoad]時,它實際上是在生成對objc_msgSend(self,@ selector(viewDidLoad),...)的調用,該調用使用“ self”(在本示例中碰巧是ExtendedController的實例)來查找要執行的實際功能。 簡而言之,“自我”是實際類的實例,因此,如果超類定義了該函數,則將調用該函數。
順便說一句,調用viewDidLoad對您來說可能沒有意義,因為它是在特定時間自動調用的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.