1

假设我有一个 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 的事实无关。

谢谢!

4

1 回答 1

0

这正是它在 Objective C 中应该如何工作的方式。当您调用 [self viewDidLoad] 时,它实际上是在生成对 objc_msgSend(self,@selector(viewDidLoad),...) 的调用,它使用“self”(在此case 恰好是 ExtendedController 的一个实例)来查找要执行的实际函数。简而言之,'self' 是实际类的一个实例,所以如果一个超类定义了该函数,那么它将被调用。

顺便说一句,调用 viewDidLoad 对您来说可能没有意义,因为它是在特定时间自动调用的。

于 2013-03-01T01:46:04.377 回答