답변:
대부분의 다른 답변에서 말했듯이 인스턴스 메소드는 클래스의 인스턴스를 사용하는 반면 클래스 메소드는 클래스 이름으로 만 사용할 수 있습니다. 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
메소드입니다.
모든 기술 세부 사항은 다른 답변에서 잘 설명되었습니다. 클래스와 인스턴스의 차이점을 잘 설명한다고 생각하는 간단한 비유를 공유하고 싶습니다.
클래스 등이다 청사진 집 : 당신은 단지 하나의 청사진과이 (보통) 당신은 혼자 청사진과 그 정도를 할 수 없습니다.
예 (또는 객체 ) 실제입니다 집에 당신이 청사진에 따라 만드는 것이 : 당신은 같은 청사진에서 주택을 많이 구축 할 수 있습니다. 그런 다음 다른 인스턴스에 영향을주지 않고 클래스의 각 인스턴스의 속성을 독립적으로 변경할 수있는 것처럼 각 주택에서 다른 색상으로 벽을 페인트 할 수 있습니다.
difference between class method and an instance method
.
다른 답변에서 말했듯이 인스턴스 메소드는 객체에서 작동하고 인스턴스 변수에 액세스 할 수 있지만 클래스 메소드는 클래스 전체에서 작동하며 특정 인스턴스의 변수에 액세스 할 수 없습니다 (인스턴스를 매개 변수).
클래스 메소드의 좋은 예는 클래스의 총 인스턴스 수를 리턴하는 카운터 유형 메소드입니다. 클래스 메서드는로 시작 +
하지만 인스턴스 메서드는로 시작 합니다 -
. 예를 들면 다음과 같습니다.
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에만 국한되지는 않지만 다른 언어에서는 클래스 메소드를 정적 메소드라고 할 수 있습니다.
클래스 메소드와 인스턴스 메소드의 차이점은
수업 방법
인스턴스 메소드
나는이 문제를 이해하는 가장 좋은 방법은보고 생각 alloc
하고 init
. 이 설명을 통해 차이점을 이해할 수있었습니다.
수업 방법
클래스 메소드는 클래스 전체에 적용됩니다. alloc
메소드 를 확인하면 +
이는 메소드 선언 이전에 표시된 클래스 메소드 입니다. 클래스에 적용되어 해당 클래스의 특정 인스턴스를 만들기 때문에 클래스 메서드입니다.
인스턴스 방법
인스턴스 메소드를 사용하여 클래스 전체가 아닌 해당 인스턴스에 고유 한 클래스의 특정 인스턴스를 수정합니다. init
예를 들어 ( -
전 메소드 선언으로 표시됨)은 인스턴스 메소드입니다 alloc
.
예
NSString *myString = [NSString alloc];
해당 클래스 alloc
의 인스턴스를 생성하기 위해 클래스 메소드 를 호출하고 있습니다. 메시지 수신자가 어떻게 클래스인지 확인하십시오.
[myString initWithFormat:@"Hope this answer helps someone"];
해당 인스턴스에서 일부 속성을 설정 하여 NSString
호출 myString
된 인스턴스를 수정하고 있습니다. 메시지 수신자가 인스턴스 (class의 객체) 인 방법에 주목하십시오 NSString
.
alloc
객체에 충분한 메모리를 할당 init
하고 해당 메모리 주소에있는 내용을 수정하여 객체의 상태를 정의합니다. 객체를 수정할 공간이 없으면 객체를 수정할 수 없으므로 alloc
클래스에서 해당 공간을 제공하도록 결정합니다.
내가 제대로 이해한다면
class
방법은 당신이 사용에 해당 개체의 인스턴스를 할당 할 필요가 없습니다 /를 처리합니다. class
방법은 자기가 포함 된 해당 클래스의 객체의 상태의 의존없이 작동 할 수 있습니다. class
방법이 완료되면 그 클래스의 인스턴스가 클래스 메소드에 대한 이전 호출에 할당 된 메모리를 해제 할 수 없습니다 때문에, 모든 자신의 작업 및 할당 취소에 대한 메모리를 할당 할 것으로 예상된다.
instance
방법은 그 반대이다. 해당 클래스의 인스턴스를 할당하지 않으면 호출 할 수 없습니다. 생성자가 있고 소멸자가있을 수있는 일반 클래스와 같습니다 (할당 된 모든 메모리를 정리합니다).
대부분의 경우 재사용 할 수있는 라이브러리를 작성하지 않는 한 class
변수 가 필요하지 않습니다 .
예를 들어 많은 자동차가 스폰되는 게임을 예로 들어 보겠습니다. 자동차가 인스턴스화되면
[CCar registerCar:self]
따라서 CCar 클래스는 모든 CCar의 목록을 인스턴스화 할 수 있습니다. 사용자가 레벨을 완료하고 모든 자동차를 제거하고 싶다고 가정 해 봅시다. 1- 수동으로 작성한 모든 CCar 목록을 살펴보고 whicheverCar.remove();
2- 또는 removeAllCars 메소드를 CCar에 추가하십시오. [CCar removeAllCars]에 전화 할 때 즉 allCars[n].remove();
또는 예를 들어 사용자가 시작시로드 및 저장되는 전체 앱의 기본 글꼴 크기를 지정할 수 있습니다. 클래스 메소드가 없으면 다음과 같은 작업을 수행해야 할 수도 있습니다.
fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();
클래스 메소드를 사용하면으로 도망 갈 수 있습니다 [FontHandler getDefaultFontSize]
.
removeVowels 함수와 관련하여 C #과 같은 언어에는 실제로 toLower 또는 toUpper와 같은 특정 메소드가 모두 있습니다.
예를 들어, myString.removeVowels()
및 String.removeVowels(myString)
(될 것이라고 ObjC에서 [String removeVowels:myString]
).
이 경우 인스턴스는 클래스 메소드를 호출 할 수 있으므로 둘 다 사용할 수 있습니다. 즉
public function toLower():String{
return String.toLower();
}
public static function toLower( String inString):String{
//do stuff to string..
return newString;
}
기본적으로, myString.toLower()
통화 [String toLower:ownValue]
확실한 대답은 없지만 클래스 메서드를 밀어 넣는 것이 코드를 향상시키고 샷을 제공하고 클래스 메서드를 사용하면 다른 클래스 메서드 / 변수 만 사용할 수 있음을 명심하십시오.
수업 방법
정적으로 선언 된 메소드입니다. 클래스의 인스턴스를 만들지 않고 메서드를 호출 할 수 있습니다. 클래스 메서드는 인스턴스 멤버를 알지 못하기 때문에 클래스 메서드는 클래스 멤버에서만 작동 할 수 있으며 인스턴스 멤버에서는 작동하지 않습니다. 클래스의 인스턴스 메소드는 해당 클래스의 인스턴스에서 호출되지 않는 한 클래스 메소드 내에서 호출 할 수 없습니다.
인스턴스 메소드
반면에, 클래스를 호출하려면 클래스의 인스턴스가 있어야하므로 새 키워드를 사용하여 클래스의 인스턴스를 작성해야합니다. 인스턴스 메소드는 특정 클래스 인스턴스에서 작동합니다. 인스턴스 메소드는 정적으로 선언되지 않습니다.
Objective-C에서 모든 메소드는 "-"또는 "+"문자로 시작합니다. 예:
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
"+"및 "-"문자는 메소드가 각각 class method
인지 또는 instance method
각각 인지를 지정합니다 .
이 메소드를 호출하면 차이점이 분명합니다. 여기에 메소드가 선언되어 MyClass
있습니다.
instance method
클래스의 인스턴스가 필요합니다.
MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
MyClass
다른 메소드 안에서 다음 을 MyClass
사용하는 인스턴스 메소드를 호출 할 수 있습니다 self
.
-(void) someMethod
{
[self instanceMethod];
}
그러나 class methods
클래스 자체에서 호출해야합니다.
[MyClass classMethod];
또는:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
작동하지 않습니다.
// Error
[myClass classMethod];
// Error
[self classMethod];
클래스 메소드는 일반적으로 클래스의 새 인스턴스를 작성하거나 클래스의 일부 글로벌 특성을 검색합니다. 클래스 메소드는 인스턴스에서 작동하지 않거나 인스턴스 변수에 액세스 할 수 없습니다.
인스턴스 메소드는 클래스의 특정 인스턴스에서 작동합니다. 예를 들어, 구현 한 접근 자 메서드는 모두 인스턴스 메서드입니다. 그것들을 사용하여 특정 객체의 인스턴스 변수를 설정하거나 얻습니다.
인스턴스 메소드를 호출하려면 메시지를 클래스의 인스턴스로 보냅니다.
클래스 메서드를 호출하려면 메시지를 클래스에 직접 보냅니다.
클래스 메소드는 인스턴스 변수의 값을 변경하거나 알 수 없습니다. 그것이 인스턴스 메소드가 클래스 메소드가 될 수 있는지를 알기위한 기준이되어야합니다.
위의 답변에 대한 업데이트는 인스턴스 메소드가 클래스의 인스턴스를 사용하는 반면 클래스 메소드는 클래스 이름으로 만 사용할 수 있음에 동의합니다.
Objective-C에서 자동 참조 카운팅이 발생한 후 인스턴스 메소드와 클래스 메소드 사이에는 더 이상 차이가 없습니다.
예를 들어 [NS StringWithformat:..]
클래스 메소드와 [[NSString alloc] initwihtformat:..]
인스턴스 메소드는 모두 ARC 후에 동일합니다.
참고 : 이것은 의사 코드 형식입니다
수업 방법
컴파일 타임에 필요한 것은 거의 전부 입니다. 사용자 입력이 필요하지 않으며 계산도 인스턴스를 기반으로합니다. 이에 대한 모든 것은 클래스 / 청사진을 기반으로합니다. 즉, 하나의 클래스에 대해 여러 개의 청사진이 없습니다. 컴파일 시간 동안 다른 변형을 가질 수 있습니까? 따라서 클래스는 고유하므로 클래스 메서드를 몇 번 호출하더라도 포인터를 가리키는 포인터는 동일합니다.
PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.
인스턴스 방법
이 때문에 반대로 인스턴스 메소드에서 실행하는 동안 발생하는 경우에만 다음 당신이 모든 인스턴스에 따라 달라질 수있는 일의 인스턴스를 만들 었는지.
initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.
다른 언어에서 오는 경우 정적 메서드는 클래스 메서드와 동일합니다.
Swift에서 온 경우 유형 메소드는 클래스 메소드와 동일합니다.
위의 답변에 추가
클래스 메소드 는 클래스에서 작동합니다. + stringWithFormat, 클래스 크기 및 init 등의 경우 가장 일반적인 용도로 사용합니다.
NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat];
인스턴스 메소드 는 두 사람이있는 것처럼 클래스가 아닌 클래스의 인스턴스에서 작동하며 인스턴스 메소드를 사용해야하는 각각의 균형을 별도로 알고 싶습니다. 일반적인 응답을 반환하지 않기 때문입니다. 예를 들어 NSSArray의 개수 등을 결정합니다.
[johnson getAccountBalance];
[ankit getAccountBalance];