2013-02-17 2 views
1

몇 년 전에 다시 인스턴스 대 클래스 방법에 대한 질문이있었습니다. 아래 코드로 설명했습니다. 나는 대부분의 경우, 왜 인스턴스 변수 "age"와 인스턴스 메소드 "age"가 필요한지를 제외하고는 무엇을 알고 있습니까?objective-c 인스턴스 변수

인스턴스 변수 "age"에 대한 getter 및 setter를 @synthetize로 만들지 않겠습니까? 이 코드는 분명히에서 소위 "오브젝티브 C 2.0"로 소개 된 선언 된 속성의 도입과 @sythesize 지침, 이전에 기록 된

+1

"__With getter and setter 인스턴스 변수"age "는 @synthetize를 사용하여 만들 수 있습니까? __"게시 된 코드는 속성을 사용하지 않습니다. 이 코드에는'@ property' 나'@ synthesize'가 없습니다. – rmaddy

답변

5

인스턴스 메서드 age캡슐화입니다. 서브 클래스가 메서드를 오버라이드 (override) 해, 필요에 따라서 다른 구현을 제공 할 수 있습니다. 예를 들어, 서브 클래스는 초기 날짜와 현재 날짜를 저장하는 대신에 나이를 계산할 수 있습니다. 인스턴스 변수를 사용하는 경우 하위 클래스에는 age을 재정의 할 수있는 옵션이 없습니다. 인스턴스 메소드를 추가하면 하위 클래스가 새 구현을 제공 할 수 있습니다.

age에 글을 쓸 수 없다는 또 다른 장점은 클래스 사용자가 age을 얻을 수 있지만 set 수 없습니다.

인스턴스 변수 "age"에 대한 getter 및 setter가 @synthetize으로 생성되지 않습니까?

@synthesize에는 클래스에서 누락 된 속성 선언이 필요합니다. 속성은 언어에 비교적 익숙하지 않아 사용자가 찾은 코드에서 사용되지 않는 이유를 설명 할 수 있습니다.

같은 일이 재산 대신의 바르 및 접근을 선언되어 일을하고, 전부 @synthesize을 건너 뛰는의 현재 방법 :

@property (nonatomic, readonly) int age; 

당신은 할당하여 클래스 내부에서 age에 기록 할 수 있습니다 _age, 뒷받침 변수가 자동으로 생성됩니다. 사용자는 [obj age] 또는 obj.age 구문을 사용하여 값을 읽을 수 있습니다.

3

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]); 

(@micmoo에서 원본 코드) Mac OS X Leopard의 시간. 간략한 소개 is available at The Cacao, 이는 오래된 방법이 무엇인지 보여줍니다.

예, 현대적인 방법으로하는 것이 훨씬 낫 겠지만, 어둠의 시대에는 클래스의 인터페이스에서 모든 ivar을 선언하고 모든 setter와 getter를 수동으로 작성해야했습니다. 매 하나마다, 눈 속에서 두 가지 방법으로 오르막을 오르지 마세요.