2

重複の可能性:
いつスーパーと呼ぶべきですか?

[super viewDidLoad]またはのようなスーパークラスメソッドを呼び出すときに違い/好ましい方法はあります[super init][super viewDidUnload]?子クラスメソッドの最初の行または最後の行にそれらを配置するチュートリアルを見てきました。スーパークラスメソッドが、事前に呼び出されたときに子が使用できるセットアップを実行するのか、またはスーパーが最後に呼び出されたときに子が実行したことに対していくつかの最適化を実行できるのかなど、依存関係があるのではないかと思っています。

4

2 に答える 2

4

私の一般的な経験則では、建設/作成の行為はsuper最初に呼び出され、破壊または破壊状態の行為は逆の順序で発生します-super最後に呼び出されます。それから逸脱する必要はめったにありません。

その理由は通常、(投稿で尋ねられたように)最適化のためではなく、予測可能なセマンティクスのためです。

例A:

工事:

- (id)init
{
  self = [super init]; // << set up super
  if (0 != self) {
    // set up self
  ...

破壊:

- (void)dealloc
{
  [ivar release], ivar = 0; // << tear down self
  [super dealloc]; // << tear down super

例B:

工事:

- (void)viewWillAppear:(BOOL)pAnimated
{
  [super viewWillAppear:pAnimated]; // << call through super first
  // now set up self
  ...

破壊:

- (void)viewDidDisappear:(BOOL)pAnimated
{
  // tear down self
  [super viewDidDisappear:pAnimated]; // << now tear down super
于 2012-09-10T05:18:00.337 に答える
0

スーパーコンストラクターには元の値以外の値を返すオプションがあるため、最初にスーパーを初期化する必要がありますself

self = [super init];

selfを呼び出す前にの他のプロパティを初期化すると[super init]、これらの変更が消去される場合があります。

いったいそれは何のためですか?

@Justinは、クラスクラスター(NSDictionaryまたはNSStringのインスタンスを返すときに使用)がこのメカニズムを使用して、タスクに応じてわずかに異なるサブクラスを提供することに注意しています。シングルトンもこれを使用できPose、Objective-Cの(現在は非推奨の)関数も使用できます。

于 2012-09-10T05:15:53.980 に答える