Objective-C에서 방법 옆의 더하기 및 빼기 기호는 무엇을 의미합니까?


180

Objective-C에서 메소드 정의 옆 의 +-기호 가 무엇을 의미하는지 알고 싶습니다 .

- (void)loadPluginsAtPath:(NSString*)pluginPath errors:(NSArray **)errors;

답변:


226

+클래스 메서드 -를위한 것이고 인스턴스 메서드를위한 것입니다.

예 :

// Not actually Apple's code.
@interface NSArray : NSObject {
}
+ (NSArray *)array;
- (id)objectAtIndex:(NSUInteger)index;
@end

// somewhere else:

id myArray = [NSArray array];         // see how the message is sent to NSArray?
id obj = [myArray objectAtIndex:4];   // here the message is sent to myArray

// Btw, in production code one uses "NSArray *myArray" instead of only "id".

클래스와 인스턴스 메소드의 차이점을 다루는 또 다른 질문 이 있습니다 .


62
"정적"의 여분의 5 개 문자가 어쨌든 너무 많은 것처럼 보입니다.
아논.

23
@Anon : 메소드는 정적이지 않습니다. 그것들은 클래스 메소드입니다. 그것들은 재정의 될 수 있으며 클래스 계층의 일부입니다. static은 C에서 매우 다른 것을 암시합니다.
bbum

4
@Avon, 그것은 당신을위한 사과입니다. 그들은 카메라에도 플래시를 남기고 마우스에는 오른쪽 버튼을 남겨 둘 것입니다. =)
pokstad

13
@bbum은 돈입니다. Java가 "정적"키워드를 다시 적용하여 다른 것을 의미한다는 사실은 훨씬 오래된 C의 결함이 아닙니다. C에서는 사용법이 완전히 직관적이지 않을 수도 있지만 Java에서는 그다지 덜합니다. 나는 정적이 변하지 않는 동적의 반대라고 기대합니다. 물론 Objective-C 언어는 Apple이 OS X에서 채택하기 전 거의 15 년 동안있었습니다.
Quinn Taylor

3
정적 메소드와 클래스 메소드의 차이점 : MYBaseClass 및 서브 클래스 MYSubClass에서 + foo 메소드를 정의하십시오. NSArray * classes = @ [[MYBaseClass 클래스], [MYSubClass 클래스]]; [클래스 makeObjectsPerformSelector : @selector (foo)]; 정적 방법으로는 작동하지 않습니다. 그건 내가 선호 would'a 말했다 @classmethod@method도 정도. 왜 그렇게 간결한가 ...?
uliwitness

45

클래스 메소드의 경우 (+), 인스턴스 메소드의 경우 (-),

(+) 수업 방법 :-

정적로 선언 된 메소드입니다. 클래스의 인스턴스를 만들지 않고 메서드를 호출 할 수 있습니다. 클래스 메서드는 인스턴스 멤버를 알지 못하기 때문에 클래스 메서드는 클래스 멤버에서만 작동 할 수 있으며 인스턴스 멤버에서는 작동하지 않습니다. 클래스의 인스턴스 메소드는 해당 클래스의 인스턴스에서 호출되지 않는 한 클래스 메소드 내에서 호출 할 수 없습니다.

(-) 인스턴스 메소드 :-

반면에 클래스를 호출하려면 클래스의 인스턴스가 있어야하므로 새 키워드를 사용하여 클래스의 인스턴스를 작성해야합니다. 인스턴스 메소드는 특정 클래스 인스턴스에서 작동합니다. 인스턴스 메소드는 정적으로 선언되지 않았습니다.

만드는 방법?

@interface CustomClass : NSObject

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

@end

사용하는 방법?

[CustomClass classMethod];

CustomClass *classObject = [[CustomClass alloc] init];
[classObject instanceMethod];

18

+ 메소드는 클래스 메소드입니다. 즉, 인스턴스 특성에 액세스 할 수없는 메소드입니다. 인스턴스 변수에 액세스 할 필요가없는 클래스의 alloc 또는 helper 메소드와 같은 메소드에 사용됩니다.

-메소드는 인스턴스 메소드-오브젝트의 단일 인스턴스와 관련됩니다. 일반적으로 클래스의 대부분의 메소드에 사용됩니다.

자세한 내용은 언어 사양 을 참조하십시오 .


실제로 클래스 메소드는 인스턴스 변수에 액세스 할 수 있습니다. 인스턴스는 self, 대신 클래스가 없습니다. 그것들은 단순히 인스턴스와 관련이 없으며 메소드 조회는 인스턴스가 아니라 클래스를 통해 이루어집니다. 아직도, 당신은 할 수 있습니다+exchangeIVarOf: (MYObject*)a with: (MYObject*)b { MYObject* x = a->ivar; a->ivar = b->ivar; b->ivar = x; }
uliwitness

5

Apple의 결정적인 설명은 여기 '방법 및 메시징'섹션에 있습니다.

https://developer.apple.com/library/mac/referencelibrary/GettingStarted/RoadMapOSX/books/WriteObjective-CCode/WriteObjective-CCode/WriteObjective-CCode.html

간단히 :

+는 '클래스 방법'을 의미합니다

클래스의 인스턴스를 인스턴스화하지 않고 메소드를 호출 할 수 있습니다. 그래서 당신은 이것을 다음과 같이 부릅니다.

[className classMethod]; 


- '인스턴스 방법'을 의미

먼저 객체를 인스턴스화해야하며 객체에서 메소드를 호출 할 수 있습니다). 다음과 같이 객체를 수동으로 인스턴스화 할 수 있습니다.

SomeClass* myInstance = [[SomeClass alloc] init];

(이것은 본질적으로 객체에 대한 메모리 공간을 할당 한 다음 해당 공간에서 객체를 초기화합니다-지나치게 단순화되었지만 그것에 대해 생각하는 좋은 방법입니다. 객체를 별도로 할당하고 초기화 할 수는 있지만 절대 그렇게하지 마십시오 -포인터와 관련된 불쾌한 문제가 발생할 수 있습니다 및 메모리 관리)

그런 다음 인스턴스 메소드를 호출하십시오.

[myInstance instanceMethod]

Objective C에서 객체의 인스턴스를 얻는 다른 방법은 다음과 같습니다.

NSNumber *myNumber = [NSNumber numberWithInt:123];

이것은 NS 팩토리 클래스 의 'numberWithInt' 클래스 메소드 를 호출합니다 . 이것은 '팩토리'메소드입니다 (즉, 객체의 '준비된 인스턴스'를 제공하는 메소드).

Objective C는 다음과 같은 문자열의 경우와 같이 특수 구문을 사용하여 특정 객체 인스턴스를 직접 만들 수도 있습니다.

NSString * myStringInstance = @ "abc";

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.