'되는'에 해당되는 글 1건

  1. 2010.06.24 iPhone SDK 변수가 되는 메소드 (함수포인터)
아이폰어플개발정보2010. 6. 24. 14:22
iPhone SDK 변수가 되는 메소드 (함수포인터)

Obj-C 를 한참 파고 있는 요즘.

내가 델파이로 자주 쓰던 패턴인 싱글톤과 약식옵저버를 구현할 수 있을까 고민했다. 싱글톤은 간단했다.

구현부에

static KNLocationManager *instance = nil;

@implementation KNLocationManager

+ (KNLocationManager *)sharedInstance {
 if (instance == nil) {
  instance = [[KNLocationManager alloc] init];
 }
 return instance;
}


참고로 아래껀 초기화 오버라이드

- (id)init {
    if ((self = [super init]) == nil)
        return nil;

    // 여기서 초기화하고..
    return self;
}


불러서 쓸때는 요렇게

- (void)viewDidLoad {
 KNLocationManager *knLocationManager = [KNLocationManager sharedInstance];

음.. 그래 싱글톤이야 뭐.. 그런데 메소드를 등록해놓고 나중에 특별한 이벤트가 발생했을 때 이 녀석을 실행시켜달라고 할 수는..?

콜백함수를 등록시키는 방법을 구현하고 싶었다.


Obj-C 에서는 메소드형을 SEL 이라는 지시자를 이용한다. 그러니까


@interface MyClass : NSObject {

id callBackTarget;

SEL callBackMethod;


이런식으로 선언할 수 있다는거다.

id 는 어떤 객체라도 받을 수 있는 객체형 와일드카드다 ^^;;

그리고 이 클래스를 사용하는 쪽에서 콜백함수를 등록시킬 수 있는 채널을 제공해야지?

MyClass에서 아래와 같은 메소드를 제공한다고 치자.


-(void)startPlus:(id)pCallBackTarget selector:(SEL)pCallBackMethod {

callBackTarget = pCallBackTarget;

callBackMethod = pCallBackMethod;


인자로 들어온 값들을 미리 선언해두었던 변수에 각각 저장해둔다.

왜냐하면 언젠가 특별한 일(?)이 생길때 저걸 이용해서 온파이어~ 를 해줘야 하니까.


자, 이제 MyClass에 온파이어를 하는 함수를 만들어보면..


- (void)fire {

IMP funcp;

funcp = [callBackTargetmethodForSelector:callBackMethod];

(*funcp)(callBackTarget, callBackMethod, 5);

}


5 는 뭘까? 파라메터 값을 테스트해본거다. MyClass 에 등록할 콜백함수의 원형을 보면


- (void)testCallback:(NSInteger)pParam1 {

NSLog(@"Callback function exected! %d", pParam1);

}


MyClass 로부터 값을 받고 있다. 파라메터값으로 말이지,

마지막으로 콜백함수를 등록하는 부분을 보고 끝내자


MyClass *myobj = [MyClasssharedInstance];

[myobj startPlus:selfselector:@selector(testCallback:)];


여기서 중요한 부분이 @selector 의 인자로 들어가는 콜러의 콜백함수 뒤에 콜론이다. ^^;;;

즉, 파라메터가 1개 있다는 뜻이다.



출처 : http://blog.naver.com/PostView.nhn?blogId=suny4rang&logNo=50081655391
Posted by 오늘마감

댓글을 달아 주세요