0

xcodeでサブクラスのすべてのメソッドを自動的にオーバーライドしたい.

- (id) init
{
    return [super init];
}

これに関する私の意図は、すべてのメソッドをログに記録して、いつ呼び出されたかを確認することです。そうすれば、私のメソッドは多かれ少なかれうまくいくでしょう

- (id) init
{
    [self log];
    return [super init];
}

ここで、ログは次の方法です。

-(void) log
{
    NSLog(@"%@",[(NSString *) (NSArray *) [NSThread callStackSymbols][1] componentsSeparatedByString:@"-["][1]);
}

どうもありがとう!

4

1 に答える 1

1

この場合、何もする必要はありません。実装を提供しない場合は、スーパークラスの実装が使用されます。

質問が編集された後に編集されました

ログステートメントをスーパークラスの実装に入れると、独自のイニシャライザーで何をするかは問題になりません。

なんで?

Cocoa の多くの規則の 1 つは、各クラスに指定された初期化子があることです。他のすべての指定された初期化子は、この初期化子を呼び出します。クラスをサブクラス化すると、新しいクラスの新しい指定イニシャライザが作成され、初期化の一部として、スーパークラスの指定イニシャライザが呼び出されます。

NSObject の指定された初期化子は init であるため、NSObject サブクラスの初期化子が [super init] を呼び出しているのはこのためです。

したがって、クラスの指定されたイニシャライザーでロギング メソッドを呼び出すだけで、上記の規則に従う限り、このイニシャライザーは常にサブクラスによって呼び出されるため、ロギング メソッドは常に呼び出されます。

于 2012-11-01T17:34:58.983 に答える