클래스 메소드와 인스턴스 메소드의 차이점은 무엇입니까?
인스턴스 메소드는 접근 자 (getter 및 setter)입니까? 클래스 메소드는 거의 모든 것입니까?
답변
대부분의 다른 답변에서 말했듯이 인스턴스 메소드는 클래스의 인스턴스를 사용하는 반면 클래스 메소드는 클래스 이름으로 만 사용할 수 있습니다. Objective-C에서는 다음과 같이 정의됩니다.
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
그런 다음 다음과 같이 사용할 수 있습니다.
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
클래스 메소드의 실제 예는 NSString
‘ +stringWithFormat:
또는 NSArray
‘ 와 같은 많은 Foundation 클래스의 편의 메소드입니다 +arrayWithArray:
. 인스턴스 메소드는 님 NSArray
의 -count
메소드입니다.
답변
모든 기술 세부 사항은 다른 답변에서 잘 설명되었습니다. 클래스와 인스턴스의 차이점을 잘 설명한다고 생각하는 간단한 비유를 공유하고 싶습니다.
클래스 등이다 청사진 집 : 당신은 단지 하나의 청사진과이 (보통) 당신은 혼자 청사진과 그 정도를 할 수 없습니다.
예 (또는 객체 ) 실제입니다 집에 당신이 청사진에 따라 만드는 것이 : 당신은 같은 청사진에서 주택을 많이 구축 할 수 있습니다. 그런 다음 다른 인스턴스에 영향을주지 않고 클래스의 각 인스턴스의 속성을 독립적으로 변경할 수있는 것처럼 각 주택에서 다른 색상으로 벽을 페인트 할 수 있습니다.
답변
다른 답변에서 말했듯이 인스턴스 메소드는 객체에서 작동하고 인스턴스 변수에 액세스 할 수 있지만 클래스 메소드는 클래스 전체에서 작동하며 특정 인스턴스의 변수에 액세스 할 수 없습니다 (인스턴스를 매개 변수).
클래스 메소드의 좋은 예는 클래스의 총 인스턴스 수를 리턴하는 카운터 유형 메소드입니다. 클래스 메서드는로 시작 +
하지만 인스턴스 메서드는로 시작 합니다 -
. 예를 들면 다음과 같습니다.
static int numberOfPeople = 0;
@interface MNPerson : NSObject {
int age; //instance variable
}
+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end
@implementation MNPerson
- (id)init{
if (self = [super init]){
numberOfPeople++;
age = 0;
}
return self;
}
+ (int)population{
return numberOfPeople;
}
- (int)age{
return age;
}
@end
main.m :
MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);
출력 : 나이 : 0 인원 : 2
또 다른 예는 사용자가 호출 할 수있는 메소드가 있고 때로는 해당 메소드를 클래스 메소드로 만드는 것이 좋습니다. 예를 들어 MathFunctions라는 클래스가있는 경우 다음을 수행 할 수 있습니다.
+ (int)square:(int)num{
return num * num;
}
따라서 사용자는 다음을 호출합니다.
[MathFunctions square:34];
클래스를 인스턴스화하지 않아도됩니다!
NSArray와 같이 자동 해제 된 객체를 반환하기 위해 클래스 함수를 사용할 수도 있습니다.
+ (NSArray *)arrayWithObject:(id)object
객체를 가져 와서 배열에 넣은 다음 메모리 관리 할 필요가없는 자동 릴리스 버전의 배열을 반환합니다. 임시 배열에는 적합하지 않습니다.
클래스 메소드를 언제 그리고 / 또는 왜 사용해야하는지 이해하기를 바랍니다.
답변
인스턴스 메소드는 클래스의 인스턴스 (즉, 객체)에 적용되는 반면 클래스 메소드는 클래스 자체에 적용됩니다.
C #에서 클래스 메소드는 정적으로 표시됩니다. static으로 표시되지 않은 메소드 및 특성은 인스턴스 메소드입니다.
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
답변
귀하의 질문에 대한 답변은 objective-c에만 국한되지는 않지만 다른 언어에서는 클래스 메소드를 정적 메소드라고 할 수 있습니다.
클래스 메소드와 인스턴스 메소드의 차이점은
수업 방법
- 클래스 변수에서 작동 (인스턴스 변수에 액세스 할 수 없음)
- 적용하기 위해 인스턴스화 할 객체가 필요하지 않습니다
- 때로는 코드 냄새가 날 수 있습니다 (OOP를 처음 사용하는 사람들은 OO 환경에서 구조적 프로그래밍을 수행하기 위해 목발로 사용)
인스턴스 메소드
- 인스턴스 변수 및 클래스 변수에서 작동
- 작동 할 인스턴스화 된 오브젝트가 있어야합니다
답변
나는이 문제를 이해하는 가장 좋은 방법은보고 생각 alloc
하고 init
. 이 설명을 통해 차이점을 이해할 수있었습니다.
수업 방법
클래스 메소드는 클래스 전체에 적용됩니다. alloc
메소드 를 확인하면 +
이는 메소드 선언 이전에 표시된 클래스 메소드 입니다. 클래스에 적용되어 해당 클래스의 특정 인스턴스를 만들기 때문에 클래스 메서드입니다.
인스턴스 방법
인스턴스 메소드를 사용하여 클래스 전체가 아닌 해당 인스턴스에 고유 한 클래스의 특정 인스턴스를 수정합니다. init
예를 들어 ( -
전 메소드 선언으로 표시됨)은 인스턴스 메소드입니다 alloc
.
예
NSString *myString = [NSString alloc];
해당 클래스 alloc
의 인스턴스를 생성하기 위해 클래스 메소드 를 호출하고 있습니다. 메시지 수신자가 어떻게 클래스인지 확인하십시오.
[myString initWithFormat:@"Hope this answer helps someone"];
해당 인스턴스에서 일부 속성을 설정 하여 NSString
호출 myString
된 인스턴스를 수정하고 있습니다. 메시지 수신자가 인스턴스 (class의 객체) 인 방법에 주목하십시오 NSString
.
답변
클래스 메소드는 일반적으로 해당 클래스의 인스턴스를 작성하는 데 사용됩니다
예를 들어, 전송 된 매개 변수 [NSString stringWithFormat:@"SomeParameter"];
가있는 NSString
인스턴스를 반환 합니다. 따라서 유형의 객체를 반환하는 Class 메서드이므로 편의 메서드라고도합니다.