2011-06-22 8 views
1

実行時にクラスからすべてのメソッドをログに記録するための新しい関数を作成しました。実行時に引数を記録する方法は?

私が持っている問題は、この行である:

id value = va_arg(stackFrame, id); 

は、引数内のオブジェクトの型を変換しません。

私が間違っていることはありますか?これを行う別の方法がありますか?

void DebugArguments (id self, SEL _cmd,...) 

{

id receiver = self; 
SEL receiverSelector = _cmd; 

va_list stackFrame; 

va_start(stackFrame, _cmd); 

NSMethodSignature *signature 
= [receiver methodSignatureForSelector:receiverSelector]; 

NSUInteger count = [signature numberOfArguments]; 

NSUInteger index = 2; 

for (; index < count; index++) 
{ 

    id value = va_arg(stackFrame, id); 
     if (!value) 
     { 
      NSLog(@"Arguments: %@",value);  
     } 
} 
va_end(stackFrame); 

}

+0

あなたが求めていることは本当にはっきりしていません。関連性のない非常に多くのコードが含まれていることは間違いありません。コードの量を減らし、コードが現在行っていることを正確に説明してください間違って、何をしたいのか – JosephH

+1

私は、次のようなクラスからInitDebug関数を呼び出します。 - (void)MyTest:(NSString *)string { InitDebug(self、_cmd); \t } MyTestメソッドから引数文字列を記録したいと考えています。 – Willy

+0

「value」の結果のタイプは何ですか?何を期待しましたか? –

答えて

1

私はこのようなクラスの機能InitDebug呼び出し: - (ボイド)のMyTest:(NSStringの*)列{
InitDebug(自己、_cmd); } メソッドMyTestから引数文字列を記録することを願っています。

今後、すべてのコードを表示すると便利です。

いずれにしても、そのことはできません。 InitDebug(...)を呼び出すと、新しいフレームをスタックにプッシュし、va_arg()はそのフレームのコンテキストではなく、周囲のフレームでデコードします。また、呼び出しフレームがその時点で保存されているという保証がないため、呼び出しスタックフレームの引数で「スタックに上がる」ことはできません。

実際にこのようなことをしたい場合は、NSProxyをサブクラス化して、呼び出し元とログに記録するオブジェクトの間のプロキシです。 Objective-Cの組み込みの転送メカニズムを活用して、引数をつぶすことができます。

関連する問題