본문 바로가기
프로그래밍 놀이터/iOS

[ios] object-c 의 기초 개념.

by 돼지왕 왕돼지 2012. 11. 4.
반응형





object-c 의 기초 개념.

Calling Methods

모든 객체 타입의 오른쪽에는 별포(*) 가 있다. 모든 object-c 객체 변수들은 포인터 타입이기 때문이다.

- id 타입은 포인터 타입으로 미리 정의되어 있기 때문에 별표를 필요로 하지 않는다.




Multi-Input Methods

- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

와 같은 함수 정의가 있으면, 이 함수의 이름은 writeToFile:atomically 이다.

:다음에는 parameter 들이 들어간다.




Accessors

- object-c 에서 모든 인스턴스 변수들은 private 이 기본 설정이기 때문에, 대부분의 경우 accessor 를 이용해야 한다. 다음의 2가지 문법으로 접근할 수 있다. 

1.x 문법

[photo setCaption:@"Day at the Beach"];

output = [photo caption];
// caption 이라는 메소드를 호출하는 것으로 접두사 get 을 붙이지 않아도 된다.




2.0 문법

- getter 와 setter 를 위해 dot 문법이 새롭게 등장했다.

photo.caption = @"Day at the Beach";

output = photo.caption;


- 위의 1.x 또는 2.0 문법 모두를 사용 가능하지만, 각각의 프로젝트에서 하나의 방법을 사용해야 한다.




Creating Objects

- 객체를 생성하는 방법은 2가지가 있다.

NSString* myString = [NSString string];

- 이 방법은 autorelease 되는 객체를 생성할 수 있다. 많은 경우 이런 스타일을 이용해서 객체를 생성하는 것이 좋다.


NSString* myString [[NSString alloc] init];

- alloc 은 메모리를 할당하고 인스턴트 객체를 생성하는 비교적 low-level의 호출이다. 많은 경우 단순 init 보다는 아래와 같이 기본값을 갖는 init 을 잘 호출하곤 합니다.

NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];




Basic Memory Management

- automatic 스타일로 객체를 생성했다면 메모리 해지를 인위적으로 해주면 안된다. 이 경우 crash 가 발생할 수 있다.

- garbage collection 의 지원을 받지 못하는 경우 alloc 한 녀석은 강제로 메모리 해지를 해주어야 한다.

// released automatically

NSString* string1 = [NSString string];


// must release

NSString* string2 = [[NSString alloc] init];

[string2 release];


// released automatically

[caption autorelease];

caption = [input retain];






Designing a Class Interface

- header 는 .h 파일에 씌여지며, 인스탄스 변수와 public 함수들을 정의한다.

- 구현부는 .m 파일에 정의되며, header 에 정의한 함수와 private 함수들을 구현한다.

header

- @interface 는 클래스의 header 선언임을 나타낸다.

- : 이후는 super class 를 명시할 때 사용한다.

- 중괄호 안에는 인스턴스 변수를 정의한다.

- 중괄호 바깥에는 public 함수들을 정의한다. 함수선언은 - 혹은 + 로부터 시작한다. - 는 public 함수이고, + 는 클래스 메소드 ( static method )임을 의미한다.

- 함수의 return 값이 명시되지 않은 경우는 id 형을 반환한다고 가정되지만, 일반적으로 이렇게 정의하진 않습니다.

- @end 는 클래스 선언의 종료를 나타낸다.

@interface Photo : NSObject {

   NSString* caption;

}

- (void) setCaption: (NSString*) input;

@end


 

implementation

- @implementation 은 클래스의 구현을 나타낸다. interface 와 같이 @end 로 마쳐진다.

@implmenation Photo{

   - (void) setCaption: (NSString*) input

   {

      [caption autorelease];

      caption = [input retain];


      // caption = input;   // g.c. support case.

   }

}


 


init

- (id) init

{

   if ( self = [super init] )

   {

      [self setCaption:@"Default Caption"];

   }

   return self;

}




dealloc

- 메모리로부터 객체가 제거될 때 객체에서 호출된다.

- (void) dealloc

{

   [caption release];

   [super dealloc];

}


- gc 가 지원되는 경우에는 dealloc 이 호출되지 않는다. 대신 finalize 메소드가 실행된다.






More on Memory Management

- object-c 의 메모리 관리 시스템은 reference counting 이다.

- alloc 은 r.c 를 +1, retain 도 r.c 를  +1, release 는 r.c 를 -1.  ( retain 은 copy 의 개념 )





Logging

- printf 와 매우 비슷한데, 토큰 추가는 %@ 를 통해 한다.

NSLog ( @"The current date and time is : %@", [NSDate date] );





Properties

- properties 는 object-c 에서 accessor 들을 자동으로 만들어 낼 수 있게 한다. @properties 는 자동으로 만들어질 수 있게 하는 허락같은 것이다.

@property (strong, nonatomic) NSString* caption;


- @properties 로 허락이 떨어졌으니, 실제로 생성하라는 명령을 내려야 한다. 이는 @synthesize 지시자를 사용해서 한다. @synthesize 로 명시했어도, getter 나 setter 를 명시적으로 구현해주면, compiler 가 구현된 accessor 는 기본으로 구현하지 않는다.

@synthesize caption;





Calling Methods on Nil

- object-c 의 nil 은 다른 언어의 NULL 포인터와 같은 것. 

 

도움이 되셨다면 손가락 꾸욱~ ( 로그인 필요 x )



반응형

댓글