5

Cocoaで常に呼び出されるメソッドはありますか?多くのクラスにはinitまたinitWithはがありますが、さらに悪いことに、ペン先などからロードできます。私はこすり回して、この場合にこれがどのように行われるかを見つける必要はありません。いくつかの初期変数などを設定したいだけで、、などに関係なく依存できるサブクラス化するメソッドがUIView必要UIViewControllerですUITableViewCell

4

3 に答える 3

9

いいえ、そのような方法はありません。 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];
    }
}
于 2012-08-01T01:30:39.570 に答える
0

常に呼び出されるとは限りませんが、これが実行可能なオプションであると確信しています。正直に言うと、この方法が実際に使用されているのを見たことがあることを思い出せません。通常、この方法を使用することを躊躇します(おそらく、これが最もクリーンで包括的な方法ではないため、理由はまったくわかりません。これ...):

-didMoveToSuperview()

ドキュメントから:

スーパービューが変更されたことをビューに通知します。このメソッドのデフォルトの実装は何もしません。サブクラスはそれをオーバーライドして、スーパービューが変更されるたびに追加のアクションを実行できます。

于 2015-04-04T15:05:33.393 に答える
-1

カスタム初期化子を作成する方法はたくさんあります。

- (id)initWithString:(NSString *)string {
    if((self == [super init])) {
        self.string = string;
    }
    return self;
}

これが、私が一般的に初期化子を作成する方法です。たとえば、上記のものは文字列を取ります。(必要がなければ、文字列を渡す必要はありません)。

ところで、initはメソッドです。NSObjectのヘッダーによると、initにはメソッド実装があります。

于 2012-08-01T23:35:07.257 に答える