문제

클래스 방법과 인스턴스 방법의 차이점은 무엇입니까?

인스턴스 방법은 액세서 (getters and setter)입니까? 클래스 방법은 다른 모든 것입니까?

도움이 되었습니까?

해결책

다른 답변의 대부분과 마찬가지로 인스턴스 방법은 클래스의 인스턴스를 사용하는 반면 클래스 메소드는 클래스 이름으로 만 사용할 수 있습니다. 대상 C에서는 다음과 같이 정의됩니다.

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

그런 다음 그렇게 사용할 수 있습니다.

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

수업 방법의 일부 실제 사례는 많은 기초 수업에서 편리한 방법입니다. NSString'에스 +stringWithFormat: 또는 NSArray'에스 +arrayWithArray:. 인스턴스 방법이 될 것입니다 NSArray'에스 -count 방법.

다른 팁

모든 기술적 세부 사항은 다른 답변에서 잘 다루었습니다. 수업과 인스턴스의 차이점을 잘 보여주는 간단한 비유를 공유하고 싶습니다.

enter image description here

수업 같다 청사진 집의 : 당신은 하나의 청사진이 있고 (보통) 청사진만으로는 그렇게 할 수 없습니다.

enter image description here

an 사례 (또는 an 물체)는 실제입니다 청사진을 기반으로 구축 한 것 : 동일한 청사진에서 많은 집을 지을 수 있습니다. 그런 다음 다른 인스턴스에 영향을 미치지 않고 클래스의 각 인스턴스의 속성을 독립적으로 변경할 수있는 것처럼 각 집에서 벽에 다른 색상을 페인트 할 수 있습니다.

다른 답변과 마찬가지로, 인스턴스 방법은 객체에서 작동하며 인스턴스 변수에 액세스 할 수있는 반면 클래스 메소드는 클래스 전체에서 작동하며 특정 인스턴스 변수에 액세스 할 수 없습니다 (인스턴스를 매개 변수).

클래스 방법의 좋은 예는 카운터 유형 방법으로 클래스의 총 인스턴스를 반환합니다. 클래스 방법은 a로 시작합니다 +, 인스턴스는 an으로 시작합니다 -. 예를 들어:

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 's와 같이 자동 엘리트 객체를 반환하기 위해 클래스 함수를 사용할 수도 있습니다.

+ (NSArray *)arrayWithObject:(id)object

객체를 가져 가서 배열에 넣고 메모리 관리가 필요하지 않은 배열의 자동 저리 버전을 반환하고 온도 배열에 적합합니다.

이제 클래스 방법을 사용해야하는 이유를 이해하기를 바랍니다.

인스턴스 메소드는 클래스의 인스턴스 (즉 객체)에 적용되는 반면 클래스 메소드는 클래스 자체에 적용됩니다.

C#에서 클래스 메소드는 정적으로 표시됩니다. 정적으로 표시되지 않은 메소드 및 속성은 인스턴스 방법입니다.

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}

이것을 이해하는 가장 좋은 방법은 alloc 그리고 init. 차이점을 이해할 수있게 해주는 것은이 설명이었습니다.

수업 방법

클래스 방법은 전체에 클래스에 적용됩니다. 당신이 확인하면 alloc 방법, 그것은 + 방법 선언 전에. 해당 클래스의 특정 인스턴스를 만들기 위해 클래스에 적용되기 때문에 클래스 방법입니다.

인스턴스 방법

인스턴스 메소드를 사용하여 클래스 전체가 아닌 해당 인스턴스에 고유 한 클래스의 특정 인스턴스를 수정합니다. init 예를 들어 (a로 표시됩니다 - 메소드 선언 이전) 이전에 해당 클래스의 속성을 작성한 후에는 일반적으로 해당 클래스의 속성을 수정하기 때문에 인스턴스 메소드입니다. alloc.

예시

NSString *myString = [NSString alloc];

당신은 클래스 방법을 호출하고 있습니다 alloc 해당 클래스의 인스턴스를 생성하기 위해. 메시지 수신자가 클래스의 방법에 주목하십시오.

[myString initWithFormat:@"Hope this answer helps someone"];

인스턴스를 수정하고 있습니다 NSString ~라고 불리는 myString 해당 인스턴스에 일부 속성을 설정함으로써. 메시지 수신기가 인스턴스 (클래스의 개체 NSString).

귀하의 질문에 대한 답변은 Objective-C에만 국한되지는 않지만 다른 언어에서는 수업 방법을 정적 메소드라고 할 수 있습니다.

클래스 방법과 인스턴스 방법의 차이점은 다음과 같습니다

수업 방법

  • 클래스 변수에서 작동합니다 (인스턴스 변수에 액세스 할 수 없음)
  • 적용되도록 인스턴스화해야하지 마십시오.
  • 때로는 코드 냄새가 될 수 있습니다 (OOP를 처음 접하는 일부 사람들은 OO Enviroment에서 구조화 된 프로그래밍을하기 위해 목발로 사용합니다)

인스턴스 방법

  • 인스턴스 변수 및 클래스 변수에서 작동합니다
  • 작동 할 객체가 있어야합니다

수업 방법은 일반적으로 해당 클래스의 인스턴스를 만드는 데 사용됩니다.

예를 들어, [NSString stringWithFormat:@"SomeParameter"]; 반환합니다 NSString 전송 된 매개 변수가있는 인스턴스. 따라서 유형의 객체를 반환하는 클래스 방법이기 때문에 편의 메소드라고도합니다.

그래서 내가 올바르게 이해한다면.

class 메소드는 해당 객체의 인스턴스를 사용할 필요가 없습니다. ㅏ class 방법은 자체적으로 포함되어 있으며 해당 클래스의 모든 대상 상태에 의존하지 않고 작동 할 수 있습니다. ㅏ class 메소드는 모든 자체 작업에 대한 메모리를 할당하고 수행 할 때 거래 할 수있는 메모리를 할당 할 것으로 예상됩니다. 해당 클래스의 인스턴스는 클래스 메소드에 대한 이전 호출에 할당 된 메모리를 제거 할 수 없기 때문입니다.

instance 방법은 반대입니다. 해당 클래스의 인스턴스를 할당하지 않으면 전화 할 수 없습니다. 그것은 생성자가 있고 소멸자를 가질 수있는 일반적인 클래스와 같습니다 (할당 된 모든 메모리를 정리).

대부분의 가능성 (재사용 가능한 라이브러리를 쓰지 않는 한 class 변하기 쉬운.

인스턴스 메소드는 클래스 인스턴스 (즉, "객체")에서 작동합니다. 클래스 방법은 클래스와 관련이 있습니다 (대부분의 언어는 키워드를 사용합니다. static 이 사람들을 위해).

예를 들어 많은 자동차가 생겨나는 게임을 예로 들어보십시오. 각각 CCAR 클래스에 속합니다. 차가 인스턴스화되면

[CCar registerCar:self]

따라서 CCAR 클래스는 모든 CCAR의 목록을 인스턴스화 할 수 있습니다. 사용자가 레벨을 마치고 모든 자동차를 제거하고 싶다고 가정 해 봅시다. 둘 중 하나가 될 수 있습니다. 1- 1- 수동으로 만든 모든 CCAR 목록을 살펴보고 수행 할 수 있습니다. whicheverCar.remove();또는 2- CCAR에 removeallcars 메소드를 추가하면 [CCAR removeallCars] 호출 할 때이를 수행합니다. 즉 allCars[n].remove();

예를 들어, 사용자가 시작시로드 및 저장된 전체 앱의 기본 글꼴 크기를 지정할 수 있습니다. 클래스 방법이 없으면 같은 일을해야 할 수도 있습니다.

fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();

수업 방법을 사용하면 도망 갈 수 있습니다. [FontHandler getDefaultFontSize].

REMINGVOWELS 기능의 경우 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];

수업 방법


클래스 방법은 일반적으로 클래스의 새로운 인스턴스를 생성하거나 클래스의 일부 전역 속성을 검색합니다. 클래스 메소드는 인스턴스에서 작동하지 않거나 인스턴스 변수에 대한 액세스가 없습니다.


인스턴스 방법


인스턴스 방법은 클래스의 특정 인스턴스에서 작동합니다. 예를 들어, 구현 한 액세서 메소드는 모두 인스턴스 방법입니다. 그것들을 사용하여 특정 객체의 인스턴스 변수를 설정하거나 얻습니다.


부르다


인스턴스 메소드를 호출하려면 메시지를 클래스 인스턴스로 보냅니다.

클래스 메소드를 호출하려면 메시지를 클래스에 직접 보냅니다.


원천: iOS -Objective -C- 클래스 메소드 및 인스턴스 방법

클래스 메소드는 인스턴스 변수의 값을 변경하거나 알 수 없습니다. 인스턴스 메소드가 클래스 메소드가 될 수 있는지 아는 기준이어야합니다.

또한 동일한 아이디어가 변수에 적용됩니다. 정적, 멤버, 인스턴스, 클래스 등과 같은 용어를 접근 할 수 있습니다.

OBJ-C 커뮤니티의 일반적인 용어는 예를 들어 변수 인 IVAR 인 것 같습니다. 그러나 나는 아직 OBJ-C 사람이 아닙니다.

위의 답변에 대한 업데이트는 인스턴스 메소드가 클래스의 인스턴스를 사용하는 반면 클래스 메소드는 클래스 이름으로 만 사용할 수 있습니다.

대상 c에서 자동 참조 계산이 존재 한 후 인스턴스 방법과 클래스 방법 사이에는 더 이상 차이가 없습니다.

예를 들어[NS StringWithformat:..] 클래스 방법 및 [[NSString alloc] initwihtformat:..] 인스턴스 방법은 둘 다 아크 다음과 동일합니다

메모: 이것은 의사 코드 형식으로 만 있습니다

수업 방법

거의해야 할 일은 중이됩니다 시간을 컴파일하십시오. 사용자 입력이 필요하지 않으며 계산은 인스턴스를 기반으로합니다. 그것에 관한 모든 것은 클래스/블루 프린트를 기반으로합니다. 즉, 독특한 IE는 한 클래스에 대한 여러 청사진이 없습니다. 컴파일 시간 동안 다른 변형을 가질 수 있습니까? 아니, 따라서 클래스는 독특하기 때문에 수업 방법을 몇 번이나 부르더라도 포인터를 가리키는 것은 동일합니다.

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, 클래스의 크기 및 가장 중요한 E 등을 위해 범용으로 이것을 사용할 것입니다.

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

인스턴스 방법 우리가 두 사람이있는 것처럼 수업이 아닌 수업의 인스턴스에서 작동하며 여기에서 각각의 균형을 알고 싶습니다. 인스턴스 방법을 사용해야합니다. 일반적인 응답을 반환하지 않기 때문입니다. 예 : NSSARRAY 등의 수를 결정하는 것과 같습니다.

[johnson getAccountBalance];
[ankit getAccountBalance];
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top