2011-09-09 5 views
1

및 속성 및 메서드 선언 앞에있는 - 및 + 기호는 많이 혼란스럽게합니다.+ 및 - 메서드의 속성을 정의 할 때의 차이점은 무엇입니까?

- (void)methodName:(id)sender {} 

나는 정말 그것을 얻을하지 않습니다이 방법

+ (void)methodName:(id)sender {} 

: 나는 방법이 방법을 선언하는 경우 차이가있다.

+2

불쾌감은 없지만 뇌관을 읽어야하는 것처럼 들립니다. 여기에서 시작하십시오 : http://developer.apple.com/library/mac/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.htaccess Admin Home English Language Content –

+0

나는 C와 Java와 같은 다른 언어를 알았 기 때문에 나는 그다지 다르지 않을 수도 있기 때문에 내가 가질 필요가 없다고 생각했다. 나는 정말로 그럴 필요가있다. 감사합니다 –

답변

6

'+'메서드는 클래스 메서드이며 직접 메타 클래스에서 호출 할 수 있습니다. 따라서 인스턴스 변수에 액세스 할 수 없습니다.

'-'메서드는 클래스의 관련 인스턴스에 대한 모든 액세스 권한을 가진 인스턴스 메서드입니다.

예.

[SomeClass classMethod]; // called directly on the metaclass 

을 또는 :

@interface SomeClass 

+ (void)classMethod; 
- (void)instanceMethod; 

@property (nonatomic, assign) int someProperty; 

@end 

당신은 연속적으로 수행 할 수

SomeClass *someInstance = etc; 

[someInstance instanceMethod]; // called on an instance of the class 

참고 :

+ (void)classMethod 
{ 
    NSLog(@"%d", self.someProperty); // this is impossible; someProperty belongs to 
            // instances of the class and this is a class 
            // method 
} 
+0

그래서 내가 제대로 이해한다면, 어느 정도 정적 메서드를 호출하는 것과 비교할 수 있습니다. 인스턴스화 할 필요는 없습니다. 외부 변수에 액세스 할 수없는 경우이를 사용하는 목적은 무엇입니까, 설명해주십시오. 빠른 응답을 주셔서 감사합니다. –

+0

@No One in Particular의 답변은 무엇이 그들의 용도인지 설명합니다. 다시 한번 감사드립니다. –

+1

이것이 metaclass라는 용어의 올바른 사용법이라고 생각하지 않습니다. http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html –

1

토미의 대답 @에 embelish하기 위해, (-) 방법을 '자기'변수를 사용할 것이다. 메소드가 작동 할 클래스 인스턴스입니다. (+) 메소드는 그것을 가지지 않습니다. 예를 들어

, 당신이 클래스는 foobar이 있고 당신이 다음 중 하나를 할 수있는, 두 인스턴스를 비교하고 싶다면 :

+ (BOOL) compare:(FooBar)fb1 and:(FooBar)fb2 { 
     // compare fb1 and fb2 
     // return YES or NO 
} 

또는

- (BOOL) compare:(FooBar)fb2 
     // compare self and fb2 
     // return YES or NO 
} 

을 두 번째 루틴을있다 ' self '변수는 첫 번째 루틴의 fb1과 유사합니다. (이 루틴은 인위적인,하지만 난 당신이 사진을 얻을 수 있기를 바랍니다.)

+3

클래스 메소드도 숨겨진'self' 매개 변수를 가지고 있지만 인스턴스가 아닌 클래스 객체를 가리 킵니다. –

+0

또한'+'와'-'를 감싸고있는 괄호는 대신 리턴 타입을 둘러싸 야합니다. –

+0

@Bavarious - 수정 해 주셔서 감사합니다. 이미 편집되었습니다. (나는 이것을 비행장에 넣었습니다.) –

1

- (void)methodName:(id)sender {}

당신이 클래스의 인스턴스를 만들 의미있는 인스턴스 메소드로서, 객체의 메소드를 호출하거나 목적에 -C 말투, 개체 선택기에 메시지를 보냅니다.

+ (void)methodName:(id)sender {}

는 먼저 개체를 인스턴스화하지 않고, 클래스 자체에 호출 정적 방법을 의미하는 클래스의 방법이다.

다음 예제에서 allocstringWithString은 클래스 메서드이며 NSString 클래스에서 직접 호출하므로 개체가 필요하지 않습니다. 반면에 initWithString[NSString alloc]이 반환 한 객체를 호출하는 인스턴스 메서드입니다.

NSString* test = [[NSString alloc] initWithString:@"test"]; 

NSString* test2 = [NSString stringWithString:@"test2"]; 
관련 문제