2011-01-19 1 views
5

이 같은 인라인 등의 기능을 선언 할 수 있습니다 : 당신이 DEBUG에 없을 때 그것은 최적화 및 인라인 있기 때문에, 기능에 아무런 비용이 없습니다Objective-C에서 정적 클래스 메서드를 인라인 할 수 있습니까?

#ifdef DEBUG 
void DPrintf(NSString *fmt,...); 
#else 
inline void DPrintf(NSString *fmt,...) {} 
#endif 

있도록. 클래스 메쏘드와 같은 것을 원한다면 어떨까요?

내 클래스는 다음과 같이 선언한다 :

@interface MyClass : NSObject { 

} 

    + (void)DPrintf:(NSString *)format, ...; 
    // Other methods of this class 
@end 

내가 메소드를 호출에는 비용이 없다 있도록 inline 비슷한에 'DPrintf을'변환 할.

그러나 나는이 작업을 수행 할 수 없습니다

inline +(void)DPrintf:(NSString *)format, ...; {} 

을 어떻게 클래스의 제로 선정 된 정적 방법은 비 디버그 컴파일을 끌 수 있을까요?

답변

8

주의하십시오. Objective-C 메소드는 C 함수와 동일하지 않습니다. Objective-C 메소드는 컴파일러에 의해 objc_msgSend() 함수 호출로 변환됩니다. 메서드가 인라인인지 여부는 관련이 없으므로 제어 할 수 없습니다. Objective-C 런타임 here (Objective-C Runtime Programming Guide), here (Objective-C Runtime Reference)here (CocoaSamurai post)에 대한 자세한 내용을 볼 수 있으며 빠른 Google 검색을 통해 더 많은 정보를 얻을 수 있습니다.

+4

또한 조기 최적화를 조심하십시오. 물건을 인쇄하는 함수의 인라인 표시는 함수가 많이 호출 되더라도 시간을 많이 절약하지는 못합니다. 인라인은 대부분 반환 값이 계산하기 쉬운 곳에서만 의미가 있습니다. 따라서 함수 호출 오버 헤드가 중요합니다. printf의 변형을 포함하는 어떤 것도 호출되는 명령의 수 측면에서 쉽지 않습니다. –

+4

오늘날 현대 컴파일러 (GCC 또는 Clang)는 일반적으로 자체적으로 잘 작동하는 함수를 인식하는 방법을 알고 있으며, 자체적으로이를 표시합니다. 필자는 컴파일러가 인라인으로 함수를 표시할지 여부를 무시하는 C 컴파일러에 대해서도 들었습니다. 조심성 있는). –

6

Objective-C에는 정적 메서드와 같은 것이 없습니다. 클래스 메소드는 클래스에 속하는 것을 제외하고 인스턴스 메소드와 같습니다. 즉, 인스턴스 메소드와 마찬가지로 클래스에 전송되는 메시지는 호출 할 올바른 메소드를 결정하기 위해 메시지 디스패치 기계를 거쳐야하며 런타임에 완료되어야합니다. 메서드 디스패치 기계에 대한 호출을 인라인 할 수는 있지만 메소드 본문은 여전히 ​​Objective-C 컴파일러에없는 최적화 수준이 아니라면 인라인 될 수 없습니다.

어쨌든 이것은 미세 최적화입니다. 프로파일 링을 통해 필요한 경우 (거의 불가능 함) 보여 주면 체조를 진행할 수 있습니다. 그렇지 않으면 응용 프로그램의 실제 성능 문제에 대해 걱정하십시오.

+3

클래스 메서드와 정적 메서드가 동의어 인 Java 배경에서 오는 것들에 대해서 Objective-C 클래스 메서드는 동적으로 해석된다는 점에주의하십시오. 클래스 개체를 조작하면 정적 인 것이 아닙니다. http://en.wikipedia.org/wiki/Method_(computer_programming) –