clojure – 네임스페이스안에 정의되어 있는 함수 보기

클로저 개발을 하다 보면, 네임스페이스 안에 정의되어 있는 함수들을 보고 싶을 때가 있다.

LightTable이 아닌 autocomplete가 제공되지 않는 IDE에서 개발을 할때면, 아.. 뭐지? 공욕을 치룰때가 있다.

그럼 어떻게 네임스페이스안의 함수들을 볼 수 있을지 알아 보자.

1. keys 함수를 이용하여, 함수 시퀀스 반환하기.

user=> (keys (ns-publics 'foo))

그 외 ns- 많은 함수들을 제공하니 찾아서 실험해보도록 하자.

2. dir 함수를 이용하기. dir함수는 clojure.repl에 선언되어 있는 함수이다.

user=> (require 'clojure.repl)
user=> (clojure.repl/dir 'foo)

그 외 다른 방법도 있으나, 위 두가지 방법이 제일 괜찮은거 같다.

이상.

iPhone – 예전 디바이스에서 최신 API를 사용하는 몇 가지 방법

출처 : http://lambert.tistory.com/569

새로운 C 상수를 확인하는 법

[sourcecode language=”ObjC”]
if (&UIKeyboardFrameBeginUserInfoKey != NULL)
{
// 이제 상수를 사용하면 된다.
}
[/sourcecode]

UIKeyboardFrameBeginUserInfoKey는 NSString *const(포인터)로 정의되어 있다. 이 상수의 값은 메모리 주소를 확인하여 현재 OS에서 사용가능한지 확인할 수 있다. 예전 OS에서는 NULL을 반환할 것이다.

새로운 C 함수를 확인하는 법

[sourcecode language=”ObjC”]
if (UISomeNewMethod != NULL)
{
// 함수 호출
UISomeNewMethod();
}
[/sourcecode]

위의 상수 확인 방법과 유사하다.

클래스의 새로운 메서드 확인하는 법

[sourcecode language=”ObjC”]
SEL sel = @selector(scale);
if ([UIScreen instancesRespondToSelector:sel])
{
// scale 이용 가능.
}
[/sourcecode]

클래스를 확인하는 법

[sourcecode language=”ObjC”]
Class kvsClass = NSClassFromString(@"NSUbiquitousKeyValueStore");
if (kvsClass)
{
// iCloud class 이용 가능
}
[/sourcecode]

[iPhone] 객체 간 인터페이스 (NSMethodSignature & NSInvocation)

NSMethodSignature & NSInvocation

Cocoa 프로그래밍에서는 위 두개의 클래스를 소개한다.
이는 SDK 2.0이상 사용이 가능하며 iOS 개발에도 유용하게 사용할 수 있다.

메시지 포워딩 또는 n개 이상의 Argument를 전달할 때 사용 할 수 있으며,

실제로 두 클래스는 NSObject클래스에 정의 되어 오버라이딩하여 사용한다.

아래는 예제 코드이다.

[sourcecode language=”objc”]
//
// main.c
// MessageForwarding
//
// Created by hojun baek on 11. 4. 6..
// Copyright 2011 __MyCompanyName__. All rights reserved.
//

#import <Foundation/NSString.h>
#import <Foundation/NSMethodSignature.h>
#import <Foundation/NSInvocation.h>
#import <Foundation/NSAutoreleasePool.h>
#import <stdio.h>
#import <stdlib.h>

@interface EZTest : NSObject{
NSString *str;
}
@end

@implementation EZTest
– (id)initWithString:(NSString *)theStr {
self = [super init];
if (self) {
str = [theStr retain];
}
return self;
}

– (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
if ([super respondsToSelector:aSelector]) {
return [super methodSignatureForSelector:aSelector];
} else {
return [str methodSignatureForSelector:aSelector];
}
}

– (BOOL)respondsToSelector:(SEL)aSelector{
if([super respondsToSelector:aSelector])
return YES;
if([self methodForSelector:aSelector] != (IMP)NULL)
return YES;
if ([str methodForSelector:aSelector]) {
return YES;
}
return NO;
}

– (void)forwardInvocation:(NSInvocation *)anInvocation{
SEL sel = [anInvocation selector];
if ([super respondsToSelector:sel]) {
[super forwardInvocation:anInvocation];
} else {
[anInvocation invokeWithTarget:str];
}
}

// send message with argument.
– (void)print {
SEL selector = @selector(sendWithMsg1:msg2:msg3:);
NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:selector];

NSInvocation * invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:self];
[invocation setSelector:selector];

NSString *msg1 = @"welcome ";
NSString *msg2 = @"to ";
NSString *msg3 = @"easy cocoa";

[invocation setArgument:&msg1 atIndex:2];
[invocation setArgument:&msg2 atIndex:3];
[invocation setArgument:&msg3 atIndex:4];
[invocation retainArguments];
[invocation invoke];

}

– (void)sendWithMsg1:(NSString *)msg1 msg2:(NSString *)msg2 msg3:(NSString *)msg3 {
NSLog(@"%@%@%@", msg1, msg2, msg3);
}
@end

int main (int argc, const char * argv[]) {
id test;
id pool = [[NSAutoreleasePool alloc] init];
test = [[EZTest alloc] initWithString:@"hello "];
NSLog(@"%@",[test stringByAppendingFormat:@"world"]);

[test print];
[test release];
[pool release];
return 0;
}
[/sourcecode]