Cocoaで常に呼び出されるメソッドはありますか?多くのクラスにはinit
またinitWith
はがありますが、さらに悪いことに、ペン先などからロードできます。私はこすり回して、この場合にこれがどのように行われるかを見つける必要はありません。いくつかの初期変数などを設定したいだけで、、などに関係なく依存できるサブクラス化するメソッドがUIView
必要UIViewController
ですUITableViewCell
。
3 に答える
いいえ、そのような方法はありません。 init
から来るNSObject
ので、すべてのオブジェクトがそれを使用でき、サブクラスも独自の初期化メソッドを定義します。 UIView
たとえば、を定義しinitWithFrame:
、さらに、NSCoding
を定義するなどのプロトコルからのinitメソッドがありますinitWithCoder:
。これはObjective-Cの動的な性質であり、いつでも何でも拡張できます。そうは言っても、いくつかのパターンがあります。 UIViewController
ほとんどの場合、取るinitWithNibName:bundle:
、UIView
ほとんどの場合、initWithFrame:
またはinitWithCoder:
。私がやっていることは、内部初期化メソッドを作成し、他のinitにそれを呼び出させることです。
- (void)initialize
{
//Do stuff
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
[self initialize];
}
}
- (id)initWithCoder:(NSCoder *)aCoder
{
self = [super initWithCoder:aCoder];
if(self)
{
[self initialize];
}
}
常に呼び出されるとは限りませんが、これが実行可能なオプションであると確信しています。正直に言うと、この方法が実際に使用されているのを見たことがあることを思い出せません。通常、この方法を使用することを躊躇します(おそらく、これが最もクリーンで包括的な方法ではないため、理由はまったくわかりません。これ...):
-didMoveToSuperview()
ドキュメントから:
スーパービューが変更されたことをビューに通知します。このメソッドのデフォルトの実装は何もしません。サブクラスはそれをオーバーライドして、スーパービューが変更されるたびに追加のアクションを実行できます。
カスタム初期化子を作成する方法はたくさんあります。
- (id)initWithString:(NSString *)string {
if((self == [super init])) {
self.string = string;
}
return self;
}
これが、私が一般的に初期化子を作成する方法です。たとえば、上記のものは文字列を取ります。(必要がなければ、文字列を渡す必要はありません)。
ところで、initはメソッドです。NSObjectのヘッダーによると、initにはメソッド実装があります。