簡體   English   中英

Objective-C:擴展UIViewController會帶來意想不到的“自我”和“超級”感覺

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM