2013-04-12 10 views
5

各ビュークラスには複数のinitメソッドがあります。既にUIViewの一部として組み込まれているメソッドと、追加のメソッドがあり、それぞれ同じ方法で同じ要素を設定します。したがって、私は通常これらのすべての要素の設定を含む[self initialSetup];メソッドを実行しています。コードを繰り返さずにinitを行う最良の方法は?

私が遭遇した問題は、サブクラスにもinitialSetupメソッドがあると、スーパークラスのinitialSetupメソッドがオーバーライドされるため、スーパークラスがまだ機能するためにメソッドをパブリックにする必要があるということです。メソッドがinit以外から呼び出されるべきではないので、これは組織に問題を引き起こすので、公開する理由はありません。

答えて

2

あなたには、完璧な修正がないという問題があります。あなたが理想的に持っているのは、通常の意味でサブクラス化することができないメソッドで、それはそのクラスの正確な型のインスタンスだけがアクセス可能です。

これが危険である場合、通常の習慣はクラス名をセットアップメソッドに組み込むことです。だからinitialSetupの代わりにmyViewSubclassInitialSetupのようなものがあります。

また、あなたの方法の一番上にこのような何かを追加することができます。

NSAssert([self isMemberOfClass:[ThisClass class]], 
      @"IniitalSetup called by sub- or superclass") 

次に、あなたのデバッグは、サブクラスまたはスーパークラスがあなたのinitメソッドを呼び出して終わる場合は例外が発生します構築します。これは、ブレークポイントとスタックトレースの場所を提供し、問題を非常に迅速に見つけることができます。

リリースビルドにコードは追加されません。

2

initialSetupの名前をinitialSetupClassNameのように変更します。サブクラスは、誤って同じパターンを使用したとしても、別のクラス名と同じ名前を使用しません。

プライベートメソッドには、むしろ呼び出されないように "_"接頭辞を使用することもできますが、サブクラスでもそうすることができます。

1

不幸にもObjective Cは、「クリーン」な方法でこれを達成する方法を提供しません。理想的なソリューションは保護された方法です。しかし、それは可能ではありませんObjective C

AppleはUIGestureRecognizerを作成していたときにこの問題を抱えていました。実際に誰かから呼び出されたくないメソッドがいくつかありましたが、サブクラスで上書きする必要がありました。彼らがこれに対処する方法は、別のヘッダファイル(UIGestureRecognizerSubclass.h)を作成することでした。このファイルには、オリジナルのUIGestureRecognizerのカテゴリが含まれています。追加のヘッダは、サブクラス(サブクラス化目的)によってのみインポートされます。詳細については、UIGestureRecognizer Class Referenceを参照してください。

もちろん、誰かが追加のヘッダーファイルを悪用するのを防ぐことはできませんが、少なくともあなたの意図を明確に述べ、コードをうまく構成してください。また、クラスを使用しているときに、追加のメソッドの自動補完によって「煩わされる」こともありません。

個人的に誰も直接呼び出さないことが非常に重要な場合は、私は追加ヘッダーのみを使用します。ほとんどの場合、パブリックメソッドを使用して、それが意図していることを書き留めても問題ないと思います。 iOSフレームワークには、これらのケースの多くがあります。 F.e. UIViewControllerviewDidLoadなどの多くのメソッド

2

指定された初期化子が不足しているようです。実際にセットアップを実行する公式のものとして初期化子を1つ指定し、他のすべてのユーザーにある程度のカスタマイズを呼び出すようにしてください。通常、指定されたイニシャライザは最も詳細なものになります。たとえば、init,initWithName:,initWithName:age:およびinitAsFiveYearOldNamed:の場合、指定されたイニシャライザはinitWithName:age:となり、他のイニシャライザは引数を適切に埋め込んでそのメソッドを呼び出すだけです。

関連する問題