2011-09-14 39 views
3

不是調用NSLog或Dlog的函數,而是調用該函數的函數。如何NSLog調用函數

我創建了一個類

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

所以每次有一個操作我想衡量,我會提出,在一個塊,而不是它的時間。

並且[Tools computeTime:^ {// operation}];

但是,我想知道調用computeTime的函數。我該怎麼做?

回答

7

兩個選項:

首先是濫用+[NSThread callStackSymbols]讓所有符號組成的數組調用堆棧,拉出一個你想要的。我懷疑這會比較慢。

第二個是使用宏。 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預處理沒有按不能很好地理解obj-c語法,因此塊中的任何逗號都將被解釋爲宏的單獨參數。如果我使用TOOLS_COMPUTE_TIME(op)來定義它,那麼編譯器會抱怨宏只接受1個參數,但它被賦予了多個參數。通過使用可變參數,編譯器不關心你給它多少個參數,它將把它們全部傳遞給__VA_ARGS__令牌。

6

另一個可能的答案有人搜索OP的原始問題,並增加了凱文的第一個建議,使用調用堆棧。

如果你正在尋找什麼調用的函數(方法),考慮以下因素:

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。

希望這有助於更快找到錯誤。