2011-09-14 6 views
3

NSLogまたはDlogを呼び出す関数ではなく、その関数を呼び出す関数です。NSLogを呼び出す方法

私は毎回その時、私は私ではなく、ブロックのそれを置く測定したい操作がある

+(void) computeTime:(void (^)())block 
{ 
    NSDate * currentTime = [NSDate date]; 
    block(); 
    DLog ("Time Running is: %f", [[NSDate date] timeIntervalSinceDate:currentTime); 
} 

をクラスを作成しました。

と[ツールcomputeTime:^ {//操作}]を実行します。

しかし、私はcomputeTimeを呼び出す関数を知りたいと思います。どうすればいいですか?

答えて

7

つのオプション:

最初は、コールスタック内のすべてのシンボルの配列を取得し、あなたが望むものを引き出すために+[NSThread callStackSymbols]を悪用することです。私はこれが比較的遅いと思う。

2番目はマクロを使用することです。 Cプリプロセッサには、__PRETTY_FUNCTION__という素晴らしいマクロが用意されています。このマクロには、すべて適切にフォーマットされた関数の名前が入っています。また、Obj-Cメソッドでもうまく動作します。代わりに[Tools computeTime:^{/*operation*/}]のあなたは[Tools computeTimeWithName:__PRETTY_FUNCTION__ block:^{/*operation*/}]ようなものを使用するか、またはあなたがTOOLS_COMPUTE_TIME(^{/*operation*/})言うことができるので、あなたがあなた自身のマクロでそれをすべてを包むことができます:

#define TOOLS_COMPUTE_TIME(...) [Tools computeTimeWithName:__PRETTY_FUNCTION__ block:(__VA_ARGS__)] 

注意をCプリプロセッサはdoesnのため、私は可変引数スタイルのマクロを使用しましたobj-cの構文をよく理解していないので、ブロック内のコンマはマクロとは別の引数として解釈されます。 TOOLS_COMPUTE_TIME(op)を使用して定義した場合、コンパイラはマクロが1つの引数しか取らず、複数指定されていると不満を持ちます。 varargsを使用することで、コンパイラは引数の数を気にせず、すべて__VA_ARGS__トークンに渡します。

6

OPの元の質問を探して、コールスタックを使用するためのKevinの最初の提案に追加する別の可能な答え。

、関数(メソッド)と呼ばれるものを探している場合は、次の点を考慮してください

NSArray *callStack = [NSThread callStackSymbols]; 
// Top of the stack. Current method 
NSLog(@"Current method: %@", [callStack objectAtIndex:0]); 
// Called by 
NSLog(@"called by: %@", [callStack objectAtIndex:1]); 

スタック項目がstackArrayに遠いを探している可能性があります。

これは、バグを早く見つけるのに役立ちます。

関連する問題