- Objective-C에서는 런타임 시스템의 기능을 사용해서 클래스의 일부 메소드를 런타임에 추가하거나 교체하는 것이 가능함.
- 단 지나치게 남용하면 유지보수하기 어려움.
- 최후의 수단으로 사용할 것을 권함.
- @dymamic을 지정한 프로퍼티는 이에 대응하는 접근자 메소드를 클래스에서 정의할수도 있지만, 정의하지 않아도 런타임에 함수를 동적으로 결합하는 것이 가능함.
- Objective-C의 메소드는 IMP 타입으로 표현되는 C함수이다. 첫번째 인수가 self(id타입), 두번째 인수가 SEL이 되어야 함.
- BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types);
- cls는 바인딩시키코 싶은 클래스이고, name은 메소드의 셀렉터, imp는 함수의 포인터, types는 함수의 타입 정보를 나열한 것이다. 바인딩에 성공한 경우 YES를 리턴.
- 실제 바인딩 하기
- -(void)setList:(NSArray *)obj ----> void set_list(id, SEL, NSArray *)(프로토 타입)
- class_addMethod(self, @selector(setList:). (IMP)set_list, "v@:@"); 로 함수 바인딩(클래스 메소드 안에서 호출할 경우 첫번쨰 인수에 self를 집어넣으면 됨)
* @encode()
- Objective-C는 객체를 동적으로 다루는 일이 많아 데이터를 보존하거나 통신을 할 때, 그 데이터가 실제로 어떤 데이터 타입이라는 정보를 알려줘야 하는 경우가 있다.
- Objective-C는 데이터 타입을 표현하기 위해 C문자열(const char*)의 타입 코드를 사용하지만, 타입에서 문자열을 쉽게 얻을 수 있도록 @encode()라는 컴파일러 지시자가 제공됨.
- @encode()는 인수로 타입명을 받아 컴파일할 떄 대응하는 타입으로 교체를 한다. 예를 들어 @encode(int)는 'i'가 되고, @encode(NSSize)는 '{_NSSize=ff}'가 된다.
- 주요타입의 표
코드 |
데이터 타입 |
c |
char |
s |
short |
i |
int |
l |
long |
q |
long long |
f |
float |
d |
double |
C |
unsigned char |
S |
unsigned short |
I |
unsigned int |
L |
unsigned long |
Q |
unsigned long long |
V |
void |
* |
C문자열(char *) |
@ |
객체 |
# |
킄래스 객체 |
: |
셀렉터 |
[타입] |
배열 |
{이름=타입...} |
구조체 |
^타입 |
타입의 포인터 |
? |
정해지지 않은 타입이나 요소 |
'IOS > Objective-C' 카테고리의 다른 글
NSString과 NSMutableString의 copy (0) | 2016.02.18 |
---|---|
멀티 스레드 프로그램 (0) | 2015.08.23 |
Property List (0) | 2015.08.20 |
Archive (0) | 2015.08.20 |
Copy (0) | 2015.08.18 |