'Objective-C'에 해당되는 글 1건

  1. 2009.12.22 Objective-C 공부 - alloc & init, isa
Cocoa Programming for MAC OS X 라는 책으로 문법 사항을 공부중입니다.
진도가 팍팍 나가지는 못하고;; 찔끔찔끔 이런 것도 있네 하면서 나가고 있습니다.

먼저 이번 장의 주제는 alloc 과 init 입니다. 그리고 NSObject의 isa에 관한 것입니다.
XCode의 방대한 메뉴얼에 금새 질려 버렸는데, 마음을 다 잡고 모르는 것이 있으면 성급하지 않게 익히며 나가
보려고 하고 있습니다.

초기화하는 거겠지라고 생각했는데 역시 C에 대해서 잘 모르니 개념적으로 헷갈리는 부분이 많아서 한번 정리하고
넘어가는 것이 좋을 거 같습니다.

1. alloc : 어느 레퍼런스에서  malloc 기능을 수행한다고 나와있는데  malloc 이라기 보단 생성자에 가깝습니다.
Objective-C 문법은

Object *obj;
obj = [Object alloc];
형태입니다.

2. init : XCode Help를 찾아보면 alloc과 같이 쓰이며, alloc 대신 자식 클래스에서 override 해서 사용하는 용도로
쓰이며, 단순히 init을 사용할 경우, self를 리턴한다고 되어 있습니다. 제가 이해하기로는 alloc과 달리 객체 instance를
초기화하기 위한 용도로 Open해 놓은 기능이라고 생각합니다.

alloc과 init을 보통은 같은 줄에 사용하여,

Object *obj = [[Object alloc] init];
과 같이 사용한다고 합니다.

초기화 관련해서는 추후 사례들이 생기면 덧 붙이도록 하겠습니다.

3. isa
XCode Help의 정의를 그대로 인용하면

The isa pointer, as the name suggests, points to the object’s class, which is an object in its own right (see Figure 2-1) and is compiled from the class definition. The class object maintains a dispatch table consisting essentially of pointers to the methods it implements; it also holds a pointer to its superclass, which has its own dispatch table and superclass pointer. Through this chain of references, an object has access to the method implementations of its class and all its superclasses (as well as all inherited public and protected instance variables). The isa pointer is critical to the message-dispatch mechanism and to the dynamism of Cocoa objects.

일단  isa는  pointer다. is a 라고 생각하면, 객체를 정의하는 pointer?
아직 개념이 잡히질 않는다.

naver 를 검색해봤다.

http://blog.naver.com/semigifn?Redirect=Log&logNo=10627140

에서 다음과 같은 해설을 찾을 수 있었다.

"모든 사용가능한 오브젝트는 isa라는 인스턴스 변수를 가지는데 이것은 오브젝트의 클래스(클래스 오브젝트 또는 그냥 클래스라고 지칭한다. - 소스코드에서의 클래스를 말한는것과는 조금 다르다)를 알려준다. 이것은 런타임 시스템에서 각각의 오브젝트가 무엇으로부터 인스턴스화 되었는지 알려주는 역할을 한다. 이것으로 실행시간에 다이나믹 타이핑을 지원한다."
[출처] Objective-C 기초|작성자 semigifn

Cocoa Programming 책에서는 
"isa는 객제를 생성하는 클래스 구조체를 가리키는 포인터로, ...
 isa가 가리키는 클래스 구조체에는 클래스의 인스턴스 변수 유형과 이름, 그리고 클래스 메서드들의 구현이 들어있으며,
 또한 수퍼클래스의 클래스 구조체를 가리키는 포인터도 있다. "

라고 되어 있다. 내가 해석하기로 NSObject를 상속받는 서브 클래스는 isa 를 인스턴스 변수로 가지고 isa 가 이 객체의 Type를 표현하는 클래스 구조체를 포인트 한다. 이 클래스 구조체를 통해서 인스턴스 변수 유형과 이름 클래스 메서드의
구현, 그리고 수퍼클래스를 지칭하는 포인터에 접근할 수 있다고 생각한다.

*여기서 잠깐.
클래스 메서드는 무엇이고, 인스턴스 메서드는 무엇인가?
일단 이렇게 이해 하겠다.

클래스 메서드 : 클래스의 인스턴스화 없이 실행되는 메서드
인스턴스 메서드 : 반드시 인스턴스화된 객체에서 실행되는 메서드

이건 뭐  Static 이냐 Non-Static 과 차이가 없지 않은가? 흠흠...;;

Posted by Actruce
이전버튼 1 이전버튼