2009-05-09 6 views
59

実装前と実装後に[super viewDidLoad]というコード例があります。`[super viewDidLoad]`のコンベンション

私はあなたがいつもsuper(他の多くの議論で見られるように)を呼ぶ必要はないと知っています。 あなたがそれを呼び出すとき、あなたはコードの前か後に期待されますか?

これは、スーパーの実装によって何らかの影響を受ける可能性があります。あなたのことを書くためにスーパーの実装を知る必要はありません。もちろん

これは(... willAppear、didAppear、など)UIViewControllersのデリゲートメソッドのすべてに行く

任意の考え?

+0

関連:http://stackoverflow.com/questions/824695/do-i-always-have-to-call-super-viewdidload-in-the-viewdidload-method – cregox

答えて

91

私の経験則は、初期化に関連することをしている場合は、まずスーパークラスのメソッドを呼び出します(呼び出す場合)。これにより、スーパークラスは後でメソッドに依存している可能性のある設定を行うことができます。破壊に関連することをしているなら、スーパークラスのメソッドを最後に呼び出します。これにより、メソッドの実行中にオブジェクトの状態に頼ることができます。最後に、ケースバイケースで他のケースを取る。たとえば、イベントを処理している場合は、イベントを最初に処理し、イベントを処理しないか、何らかの形で変更してイベントに渡したい場合にのみ、スーパークラスのメソッドを呼び出すことができます鎖。

+7

Jasonのよくあるアドバイス、およびAppleのドキュメントそれが重要なときにサブクラスの責任。例えば。いくつかの重要な動作がスーパーコールに依存する場合は、ドキュメント内で強調表示されることがよくあります。 一般に、あなたを傷つけることがない場合は、スーパーに電話して安全にしてください。 – danielpunkass

+0

ありがとう、それはかなり論理的で、私が取っていたアプローチの種類です。私は自分のクラスをサブクラス化していたので、何をすべきか選択しました。私は、viewDidLoadの前/後にセットアップを必要とすることによって、規約に違反したくはありませんでした。 –

+3

もちろん、スーパークラスに属するものを割り当て解除する前に、それらを使用する必要があるかもしれないので、その逆の-deallocです。 – mk12

0

2つのクラス、親と子があるとしましょう。子供は親から継承します。文字列を返すgreetというメソッドがあります。ここで

は、親メソッドは次のようになります。

コード:

-(NSString *)greet { 
return @"Hello"; 
} 

我々は子供が両親から学びたいと思っています。だから、私達はママがどのように挨拶するかを挨拶するのにスーパーを使いますが、私たち自身の小さな追加もあります。

コード://だから今の親は "こんにちは" 挨拶し、そして子供は "こんにちは、ママ" を迎えて親から

-(NSString *)greet { 
NSString *parentGreeting = [super greet]; 
return [parentGreeting stringByAppendingString:@", Mommy"] 
} 

を継承します。後で親の挨拶を "Hi"に戻すと、両方のクラスが影響を受け、 "Hi"と "Hi、Mommy"になります。

superは、スーパークラスによって定義されたメソッドを呼び出すために使用されます。これは、サブクラスによってオーバーライドされたメソッドにアクセスするために使用されるため、クラスがそのクラスが実装するメソッドの周りに独自のコードをラップすることができます。あなたがどんな種類の継承をしていても大変便利です。

関連する問題