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

これはまさにObjectiveCで機能するはずです。[selfviewDidLoad]を呼び出すと、実際にはobjc_msgSend(self、@ selector(viewDidLoad)、...)への呼び出しが生成されます。ケースはたまたまExtendedControllerのインスタンスであり、実行する実際の関数を検索します。つまり、「self」は実際のクラスのインスタンスであるため、スーパークラスがその関数を定義している場合は、それが呼び出されます。

余談ですが、viewDidLoadを呼び出すことは、特定の時間に自動的に呼び出されるため、おそらく意味がありません。

于 2013-03-01T01:46:04.377 に答える