2011-09-02 8 views
25

동일한 클래스 내의 다른 메서드에서 클래스 메서드를 호출 할 수있는 방법이 있습니까? 예를 들어해당 클래스 내에서 클래스 메서드 호출

: 그 작동하지 않는 경우

[MyClass classMethodA]; 

, 당신은 클래스의 인터페이스에 정의 된 메소드 서명이 있는지 확인 :

+classMethodA{ 
} 

+classMethodB{ 
    //I would like to call classMethodA here 
} 
+0

를 작성해야? 방법을 호출하는 방법 아닌가요? 이것은 obj-c에서 말하는 방법입니다. – doNotCheckMyBlog

+0

시도해 보셨습니까? 어떻게 된 거예요? –

+0

@Craftero 개체에 메시지를 보내는 것을 의미하지 않습니까? 메시지는 메소드로 전송되지 않습니다. –

답변

8

는 다음과 같이 간단 할 것이다. (일반적으로 .h 파일에 있음)

+1

그건 그것을 할 수있는 한 가지 방법입니다; 그러나 하위 분류를 존중하지 않습니다. 대부분의 경우 [self classMethodA]를 사용하는 것이 현명합니다. 클래스 메소드에서 "self"가 클래스 객체라는 것을 이해합니다 (클래스 메소드는 클래스의 인스턴스 메소드이기 때문에). 따라서 MyClass의 메서드는 호출되지만 MyClassSubclass의 클래스는 아닙니다. – csga5000

+0

또한 "같은 클래스의"질문에서 그는 말했습니다. – csga5000

3

확실히.

사용자가 정의한 이러한 방법을 말해 다음과 같이

@interface MDPerson : NSObject { 
    NSString *firstName; 
    NSString *lastName; 

} 

+ (id)person; 
+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 
- (id)initWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast; 


@property (copy) NSString *firstName; 
@property (copy) NSString *lastName; 

@end 

첫 번째 2 개 클래스 메소드가 구현 될 수있다 : 클래스 메소드에서

+ (id)person { 
    return [[self class] personWithFirstName:@"John" lastName:@"Doe"]; 
} 

+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast { 
    return [[[[self class] alloc] initWithFirstName:aFirst lastName:aLast] 
                 autorelease]; 
} 
59

, self 클래스는 메세지가되기 말합니다. 어떤 클래스도 가정하면 메시징 것을

- (void)instanceMethodB 
{ 
    // ... 
    [[self class] classMethodA]; 
    // ... 
} 

주 : 인스턴스 메소드 (예를 들어 instanceMethodB), 사용 내에서

+ (void)classMethodB 
{ 
    // ... 
    [self classMethodA]; 
    // ... 
} 

: 그래서 다른 클래스 메소드 내에서 사용 (classMethodB 말). 실제 클래스는 서브 클래스 일 수 있습니다.

+1

용어를 바꿨습니다. 인스턴스 메소드의 경우 [self foo], 클래스 메소드의 경우에는 [MyClass bar]. –

+8

아니요. '자기'의 의미는 당신이 전하는 메시지에 달려 있습니다. 클래스에 메시지를 보내면 'self'가 클래스입니다. 인스턴스에 메시지를 보내면 'self'가 인스턴스가됩니다. 나는 클래스 메쏘드에 대한 메시징의 중요성을 http://qualitycoding.org/factory-method/ –

+0

에서 설명합니다. 귀하의 의견에 당신이 말한 것은 사실이지만 답변의 용어는 말 그대로 거꾸로입니다. 인스턴스 메소드에서'[self class]'를 사용하는 것은별로 의미가 없지만, 클래스 메소드에서는 완전한 의미를 갖습니다. 인스턴스 메소드는'-'로 시작하고, 클래스 메소드는'+'로 시작하고, 객체의 인스턴스를 참조하기 위해'self'를 사용하는 것은 구문상의 의미를 가지고 있지만 객체의 인스턴스를 참조하기 위해'[self class]'를 사용한다는 것을 기억하십시오 구문 론적으로 말이되지 않습니다. '[self class]'는 클래스를 설명하는 객체에 대한 참조를 의미하며 클래스의 인스턴스는 의미하지 않습니다. –

4

대칭 C에서 'self'는 동일한 클래스 내의 다른 메소드를 호출하는 데 사용됩니다.

그래서 당신은 우리가 방법으로 메시지를 보내는 방법을 말한다 첫째

+classMethodB{ 
    [self classMethodA]; 
} 
+1

'self'는 인스턴스 메서드에만 적합하지만 질문은 그가 말하고 있음을 나타냅니다. 클래스 메소드 (메소드 이름 앞에'+'기호가 붙음) –

관련 문제