아이폰어플개발정보2011. 3. 12. 17:14

 

작업을 하다보면 객체의 멤버 변수 값을 확인하고 싶을 때가 있다.

이럴때 유용하게 사용할 수 있는 메소드가 (NSString *)description 함수이다.


NSObject 의 메소드인 description 함수는 다음과 같이 정의 되어 있다.

 

 

description

Returns a string that describes the contents of the receiver. (required)

- (NSString *)description

Return Value

A string that describes the contents of the receiver.

Discussion

The debugger’s print-object command indirectly invokes this method to produce a textual description of an object.

Availability

  • Available in Mac OS X v10.0 and later.

Declared In

NSObject.h 

 

  

위의 설명에서 볼 수 있듯이 이 메소드는 NSLog 와 같이 객체를 출력하는 메소드에서 자동 호출되어 스트링 형태의 설명을 제공한다.

이것은 override 하지 않은 채로 객체에다 쓰게 되면 다음과 같이 객체의 주소 값을 리턴한다.


 

testAppObject *obj; obj = [[testAppObject alloc] init]; NSLog(@"%@", obj); 

<코드>


<결과>


이 메소드를 활용하면 객체의 값을 확인해 볼 수가 있다.

예를 들어 다음과 같은 클래스의 객체가 있다고 하자.

 

@interface Problem : NSObject {

    NSInteger type;

    NSString title;    

    NSInteger answer;

} 

  

이 객체의 type, title, answer 의 값을 알고 싶을 때, description 메소드를 다음과 같이 수정하면 된다.


- (NSString *)description {

    return [NSString stringWithFormat:@"%d %@ %d", type, title, answer];

} 

   

위의 경우 problem 클래스 객체를 만들어 NSLog 를 이용해 출력해보면 주소 값이 아닌 멤버 변수들의 값이 츨력 될 것이다.





출처 : http://blog.daum.net/_blog/hdn/ArticleContentsView.do?blogid=0Xfhi&articleno=21&looping=0&longOpen=
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보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 오늘마감

댓글을 달아 주세요

오브젝트C2010. 6. 21. 18:29
인터페이스 및 메소드 생성에 대한 호출

코코아 프로그래밍 개정판의 첫번째 예제를 따라해 보면서 나름 대로 주석을 달아 보면서 설명을 직접해 보았다.

설명을 제대로 하고 있는지는 나 자신도 확신이 가지 않는다.

하지만 다른 사람에게 설명을 할 수 있는 수준이라면 나름대로 이해를 했다고 말할 수 있을 것이다.


objective-c는 c언어를 포함한 언어 이기 때문에 금방 배울수 있다는 생각을 가지고 있던 본인으로서는 상당히 당혹스러움을 감추지 못한 것이 사실이다. 

C++의 클래스 및 상속에 대한 기본 개념을 먼저 학습하고 다시 objective-c를 봐야 했기 때문이다.

그리고, objective-c만의 독창적인 문법에 대해서도 생소하여 기본 문법을 알아 보는데도 한참의 시간을 보냈다.

또한 단순히 xcode IDE를 이용하여 프로그래밍을 하면 된다는 생각을 하였으나 interface-builder의 사용법도 별도로 알아야 한다.

좀더 친숙해 지려면 많이 해 보는 것이 정답인 것 같다.

 



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

댓글을 달아 주세요

오브젝트C2010. 6. 21. 09:31
[Objective-C] 동적으로 메소드 호출하기

Objective-C 의 메소드 호출은 C언어로 정의된 함수 포인터를 호출하는 것과 같습니다.

typedef id (*IMP)(id, SEL, ...);

이 정의로부터도 알 수 있듯이, Objective-C에서 선언된 모든 암묵적으로 id 형태와 SEL 형태의 인수를 가집니다. 첫번째 인자는 메소드를 오브젝트를 나타내는 변수 self 입니다. 두번째 인자는 이 메소드의 selecotr를 변수 _cmd 입니다. 모든 메소드에는 이러한 숨겨진 인자가 반드시 존재합니다.


예를 들어서 사용자가 정의한 +(void) hello { NSLog(@"hello, World!!"); } 라는 메소드를 호출을 하게 되면 내부적으로 아래와 같이 호출이 됩니다.


func(self, @selector(hello));     // 여기서 func는 IMP 타입의 함수 포인터

그리고 사용자는 NSObject 클래스의 메소드인 instanceMethodForSelector를 통해서 IMP 타입의 함수 포인터를 얻을 수 있다.

(이 밖에도 여러 가지 메소드가 있음, 자세한 것은 API 참조..!!)


IMP func = [ClassName instanceMethodForSelector: @selector(hello)];

이렇게 얻은 IMP 값은 앞서 설명했던 것처럼 함수 형태로 호출이 가능하다.

첫 번째 매개변수는 호출한 메소드를 정의한 클래스 객체이고, 두 번째 매개변수는 해당 메소드의 셀렉터이다.


만약에 호출할 메소드가 매개변수를 포함하고 있다면, 아래 예제와 같이 해당 인자 값을 세 번째 매개변수로 입력하면 된다.


// 앞서 정의했던 hello 메소드가 아래와 같이 param 매개변수가 있을 경우,

// +(void) hello : (NSString *)param { NSLog(@"Hello, %@", param); }

// ...

func(self, @selector(hello:), @"Mr.Hong");

func함수는 세 번째 매개변수부터 가변적으로 입력할 수 있으므로, 셀렉터를 통해 얻은 메소드의 매개변수에 맞게 값을 입력하면 된다.
그리고 IMP 함수 포인터를 사용하지 않고, NSObject 클래스에 정의된 performSelector 메소드를 사용하면 바로 호출이 가능하다.

[self performSelector: @selector(Hello)];

performSelector 메소드는 IMP 함수 포인터를 사용하는 것과 달리 가변 인자를 지원하지 않음으로써 매개변수가 다수 일 경우에 제약이 따른다. 하지만 메소드 호출 지연 등 여러 옵션을 주어 보다 다양한 방법으로 사용할 수 있다.

[self performSelector: @selector(Hello) withObject:nil afterDelay:1.0f];
여기서 afterDelay는 해당 메소드를 호출하기까지 지연되는 시간(단위/초)이이며, withObject는 호출하는 메소드의 매개 변수 값이다.

iPhone 어플리케이션 개발을 하다 보면 델리게이트 메소드를 사용하는 경우가 많은데, 현재 동작하고 있는 델리게이트가 많을 경우에 메소드 호출 순서가 약간은 생각했던 것과 다를 수도 있다. 그런 경우에 performSelector를 사용하여 메소드 호출 시점을 조정할 수 있다.

이렇게 Objective-C에서는 동적으로 메소드를 호출할 수 있는 방법이 두 가지가 있다. 매개변수의 수가 많거나 타입이 Object가 아닐 경우에는 IMP 함수 포인터를 사용하면 되고, 메소드 호출의 지연 시간을 정하고 싶다면 performSelector 메소드를 사용하면 될 것이다.







출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110087574466

'오브젝트C' 카테고리의 다른 글

[펌] Delegate  (0) 2010.06.21
[펌] Key-Value Coding  (0) 2010.06.21
[Objective-C] 동적으로 메소드 호출하기  (0) 2010.06.21
[펌] 메소드의 포인터, IMP란?  (0) 2010.06.21
[펌] Objective-C 생성자  (0) 2010.06.21
[강좌] From C++ to Objective-C  (0) 2010.06.21
Posted by 오늘마감

댓글을 달아 주세요