2011-09-14 1 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 개의 인수 만 취하지 만 여러 번 주어진 것으로 불평합니다. 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에 더입니다 보인다고 할 수있다.

희망이 있으면 버그를 빨리 찾을 수 있습니다.