및 속성 및 메서드 선언 앞에있는 - 및 + 기호는 많이 혼란스럽게합니다.+ 및 - 메서드의 속성을 정의 할 때의 차이점은 무엇입니까?
- (void)methodName:(id)sender {}
나는 정말 그것을 얻을하지 않습니다이 방법
+ (void)methodName:(id)sender {}
: 나는 방법이 방법을 선언하는 경우 차이가있다.
및 속성 및 메서드 선언 앞에있는 - 및 + 기호는 많이 혼란스럽게합니다.+ 및 - 메서드의 속성을 정의 할 때의 차이점은 무엇입니까?
- (void)methodName:(id)sender {}
나는 정말 그것을 얻을하지 않습니다이 방법
+ (void)methodName:(id)sender {}
: 나는 방법이 방법을 선언하는 경우 차이가있다.
'+'메서드는 클래스 메서드이며 직접 메타 클래스에서 호출 할 수 있습니다. 따라서 인스턴스 변수에 액세스 할 수 없습니다.
'-'메서드는 클래스의 관련 인스턴스에 대한 모든 액세스 권한을 가진 인스턴스 메서드입니다.
예.
[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
}
그래서 내가 제대로 이해한다면, 어느 정도 정적 메서드를 호출하는 것과 비교할 수 있습니다. 인스턴스화 할 필요는 없습니다. 외부 변수에 액세스 할 수없는 경우이를 사용하는 목적은 무엇입니까, 설명해주십시오. 빠른 응답을 주셔서 감사합니다. –
@No One in Particular의 답변은 무엇이 그들의 용도인지 설명합니다. 다시 한번 감사드립니다. –
이것이 metaclass라는 용어의 올바른 사용법이라고 생각하지 않습니다. http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html –
토미의 대답 @에 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과 유사합니다. (이 루틴은 인위적인,하지만 난 당신이 사진을 얻을 수 있기를 바랍니다.)
클래스 메소드도 숨겨진'self' 매개 변수를 가지고 있지만 인스턴스가 아닌 클래스 객체를 가리 킵니다. –
또한'+'와'-'를 감싸고있는 괄호는 대신 리턴 타입을 둘러싸 야합니다. –
@Bavarious - 수정 해 주셔서 감사합니다. 이미 편집되었습니다. (나는 이것을 비행장에 넣었습니다.) –
- (void)methodName:(id)sender {}
당신이 클래스의 인스턴스를 만들 의미있는 인스턴스 메소드로서, 객체의 메소드를 호출하거나 목적에 -C 말투, 개체 선택기에 메시지를 보냅니다.
+ (void)methodName:(id)sender {}
다음 예제에서 alloc
및 stringWithString
은 클래스 메서드이며 NSString
클래스에서 직접 호출하므로 개체가 필요하지 않습니다. 반면에 initWithString
은 [NSString alloc]
이 반환 한 객체를 호출하는 인스턴스 메서드입니다.
NSString* test = [[NSString alloc] initWithString:@"test"];
NSString* test2 = [NSString stringWithString:@"test2"];
불쾌감은 없지만 뇌관을 읽어야하는 것처럼 들립니다. 여기에서 시작하십시오 : http://developer.apple.com/library/mac/#referencelibrary/GettingStarted/Learning_Objective-C_A_Primer/_index.htaccess Admin Home English Language Content –
나는 C와 Java와 같은 다른 언어를 알았 기 때문에 나는 그다지 다르지 않을 수도 있기 때문에 내가 가질 필요가 없다고 생각했다. 나는 정말로 그럴 필요가있다. 감사합니다 –