2010-04-22 2 views

답변

89

, 당신이 "클래스 메소드"를 호출 참조 here :

@interface MyClass : NSObject 

+ (void)aClassMethod; 
- (void)anInstanceMethod; 

@end 

+가 중요한 것입니다; 등의 (자기, 나, 등, 또는이) 정적 메소드 어느 쪽도 클래스의 인스턴스가 필요 없으며 암시 적으로 데이터에 액세스 할 수 있습니다 : [MyClass aClassMethod];

+2

오른쪽 링크,하지만 당신은 항상 너무 정상 글로벌 C 함수를 선언 할 수 있음을 기억하십시오. –

15

위키 백과에서 을 : 당신은 방법을 다음과 같이 호출하지 인스턴스.

이것은 Objective-C의 클래스 메소드가 정확히 무엇인지 설명합니다.

Objective-C 클래스 메소드는 메소드 호출의 대상인 인스턴스가 필요합니다. 즉, 호출되는 클래스 객체를 설명하는 메타 클래스의 인스턴스가 필요합니다.

정적 메서드와 달리 Objective-C의 클래스 메서드는 상속 될 수 있습니다 (앞에서 설명한 자체와 결합하여 많은 클래스가 NSObject에서 단일, 간단한 구현을 공유 할 수 있습니다. 구현) 및 클래스 메소드 호출은 다른 메소드 호출 사이트와 완전히 동일한 objc_msgSend * 기반 디스패치 메커니즘을 거칩니다.

Objective-C의 클래스 메서드는 클래스 계층 구조를 오버라이드 할 수 있으며이를 Swizzled 할 수 있습니다. 클래스 메소드 대신 정적 메소드를 제공하는 언어에서는 지원되지 않습니다.

클래스 메서드와 정적 메서드는 실제로 대부분 같지만 실제로 다릅니다. 정적 메소드를 사용하면 클래스가 네임 스페이스 한정자의 역할을합니다. 클래스 메소드와 클래스 자체는 객체이며, 그래서 클래스 메소드를 사용하면 classOrInstanceMethod의 버전

@interface TestClass : NSObject 

    +(void)classOrInstanceMethod; 
    -(void)classOrInstanceMethod; 

    @end 

    @implementation TestClass 

    +(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    -(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    @end 

    int main(int argc, const char* argv[]) 
    { 
     @autoreleasepool{ 
      NSLog(@"Static method in ObjectiveC"); 
     } 

     NSArray* arr = [NSArray arrayWithObjects:[[TestClass alloc]init], 
              [TestClass class], nil]; 
     for(id obj in arr) 
      [obj classOrInstanceMethod]; 
    } 

라고 다음하는 할 수있는 결과로, 정확히 같은 일이 인스턴스 메소드는 인스턴스에있는 클래스 객체에 있습니다 obj가 클래스 객체 또는 인스턴스인지 여부에 따라 다릅니다. 팩토리 클래스 패턴에 익숙하다면이 패턴은 Objective-C 언어의 일부입니다.

결론은 정적 메소드와 클래스 메소드가 매우 다르다는 것입니다. 이러한 차이는 일상적인 코딩 목적에서 대부분 투명하지만 클래스 메소드의 작동 방식을 아는 경우에도 불필요한 코드 줄을 절약 할 수 있습니다.

는 시킴으로 빨리는 herehere

+1

이것은 원래 답변이 아니라는 점에주의해야합니다. [여기에 기록되었습니다.] (https://stackoverflow.com/a/8089623/6645482) –

관련 문제