Class Implementation
구현부를 만들어 봅시다, getter로 시작합니다:
#import "Photo.h"
@implementation Photo
- (NSString*) caption {
return caption;
}
- (NSString*) photographer {
return photographer;
}
@end
코드 중 이 파트는 @implementation 과 클래스 이름으로 시작하고, interface와 같이 @end를 갖습니다. 모든 메소드들은 반드시 두 문장 사이에 있어야 합니다.
코드를 작성 해봤다면 getter는 메우 익숙해 보일 수 있어서, setter의 설명이 조금 더 필요할 것 같습니다:
- (void) setCaption: (NSString*)input
{
[caption autorelease];
caption = [input retain];
}
- (void) setPhotographer: (NSString*)input
{
[photographer autorelease];
photographer = [input retain];
}
각각의 setter는 두개의 변수와 함께 다뤄집니다. 첫번째는 존재하는 객체를 참조하기 위함이고, 두번째는 새로운 입력 객체입니다. garbage collect가 적용된 환경에서 우리는 새로운 값을 직접 설정할 수 있었습니다:
- (void) setCaption: (NSString*)input {
caption = input;
}
하지만 만일 여러분들이 garbage collection을 이용할 수 없다면, 오래된 객체를 해재하고 새로운 것을유지해야 할 필요가 있습니다.
실제로 객체에서 참조를 자유롭게 하는 방법은 해제와 자동해제 두가지가 있다. 일반적인 해제는 참조를 즉시 제거해 준다. 자동해제 메소드는 일정시간 후에 해제를 하지만, 이는 분명히 현재의 함수가 종료 될 때 까지 머무르게 됩니다(만일 여러분들이 이것을 바꾸기 위한 특별한 코드를 작성하지 않았다면).
자동해제 메소드는 setter 안에서 더 안전한데, 이는 새롭고 오래된 값들을 위한 변수들이 같은 객체를 가리킬 수 있기 때문이다. 여러분들은 유지시키고 싶은 오브젝트가 바로 해제되는 것을 원하지 않을 것입니다.
이러한 개념이 지금은 혼란스러울 수 있지만, 점점 여러분들이 나아가는데 도움이 될 것이다. 지금은 이것을 모두 숙지하지 않아도 됩니다.
Init
우리는 인스턴스 변수들을 위해 값들을 초기화는 init 메소들을 만들 수 있습니다:
- (id) init
{
if ( self = [super init] )
{
[self setCaption:@"Default Caption"];
[self setPhotographer:@"Default Photographer"];
}
return self;
}
이것은 매우자명하긴 하지만, 두번째 줄이 아주 조금 낯설어 보입니다. 이것은 하나의 equals sign(=)이고, 이는 [super init]의 결과를 self에 할당하게 됩니다.
이것은 근본적으로 슈퍼클래스가 스스로 초기화 하게 요청하게 됩니다. if 구문은 기본값을 설정하기 전에 초기화가 성공적으로 이루어졌는가를 확인합니다.
Dealloc
dealloc 메소드는 메모리로 부터 객체가 제거될 때 객체에서 호출됩니다.. 이는 흔히 여러분들의 모든 child 인스턴스 변수들의 참조를 해제하기 위한 최선의 시점입니다.
- (void) dealloc
{
[caption release];
[photographer release];
[super dealloc];
}
첫번째 두 줄은 우리가 각각의 인스턴스 변수들을 해제하기 위해 메시지를 보낸 것입니다. 여기서 자동해제는 필요하지 않으며, 스탠다드 릴리즈가 조금더 빠릅니다.
마지막 줄은 매우 중요합니다. 우리는 수퍼클래스가 클린업하도록 요청하기 위해서 [super dealloc]메시지를 반드시 보내야 합니다. 만약에 우리가 이걸 하지 않으면, 객체는 제거되지 않을 것이고 메모리 누수가 발생할 것입니다.
dealloc 메소드는 grabage collection을 이용할 수 있다면 객체에서 호출하지 않습니다. 대신, 여러분들은finalize 메소드를 실행해야 합니다.