Objective-C에서 oneway keyword

retain과 release를 overriding 하려다 보니.. release에서 oneway라는 키워드가 보이네요. 다음과 같이 말이죠.

- (oneway void)release;

무슨 말인지 찾아보니 "The Objective-C 2.0 Programming Language" PDF 파일에

"Synchronous and Asynchronous Messages
Consider first a method with just a simple return value:
- (BOOL)canDance;
When a canDance message is sent to a receiver in the same application, the method is invoked and the
return value provided directly to the sender. But when the receiver is in a remote application, two underlying
messages are required—one message to get the remote object to invoke the method, and the other message
to send back the result of the remote calculation. This is illustrated in the figure below:
<Figure 12-2>
Most remote messages are, at bottom, two-way (or “round trip”) remote procedure calls (RPCs) like this one.
The sending application waits for the receiving application to invoke the method, complete its processing,
and send back an indication that it has finished, along with any return information requested. Waiting for
the receiver to finish, even if no information is returned, has the advantage of coordinating the two
communicating applications, of keeping them both “in sync.” For this reason, round-trip messages are often
called synchronous. Synchronous messages are the default.
However, it’s not always necessary or a good idea to wait for a reply. Sometimes it’s sufficient simply to
dispatch the remote message and return, allowing the receiver to get to the task when it can. In the meantime,
the sender can go on to other things. Objective-C provides a return type modifier, oneway, to indicate that
a method is used only for asynchronous messages:
- (oneway void)waltzAtWill;
Although oneway is a type qualifier (like const) and can be used in combination with a specific type name,
such as oneway float or oneway id, the only such combination that makes any sense is oneway void.
An asynchronous message can’t have a valid return value."

라고 되어 있습니다.

요 글에 의하면 일반적으로 Objective-c 에서 remote에 있는 receiver에게 message를 전달하는 방식은 synchronous 방식이라고 합니다. 즉, 메서드를 호출하면 return 결과를 받을 때 까지 멈춘다(blocking) 이거죠.
하지만 굳이 remote 호출 시 대기 할 필요가 없는 메서드는 asynchronous 하게 호출하도록 할 수 있습니다.
이럴 때 사용되는 keyword가 oneway이며, 위의 release와 같은 경우 asynchronous 하게 호출된다고 할 수 있겠습니다.

RPC를 통한 remote 호출을 해본적이 없어서 자세한 예는 들기 힘드네요. 나중에 호출해볼 수 있는 좋은 기회가 있었으면~
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/08/27 16:56 2009/08/27 16:56
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/244

Objective-C gdb로 디버깅 하기

Objective-C를 debug할 때 다음과 같이 break point(이하 bp)를 지정할 수 있습니다.

b -[UIViewController setInterfaceOrientation:]

이렇게 지정한 뒤 실행하면 다음과 같이 중지됩니다.

Pending breakpoint 1 - "-[UIViewController setInterfaceOrientation:]" resolved
(gdb)


bt 명령을 이용하면 call stack를 볼 수 있습니다.

#0  0x3097263a in -[UIViewController setInterfaceOrientation:] ()
#1  0x30978386 in -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:] ()
#2  0x309221fb in -[UIView(Internal) _didMoveFromWindow:toWindow:] ()
#3  0x30920883 in -[UIView(Hierarchy) _postMovedFromSuperview:] ()
#4  0x3092079e in -[UIView(Internal) _addSubview:positioned:relativeTo:] ()
#5  0x3091a113 in -[UIView(Hierarchy) addSubview:] ()
.........
(gdb)


#0은 현재 bp 된 위치를 나타내며, bp를 걸었던 UIViewController setInterfaceOrientation: 에서 멈춰있는 것을 볼 수 있습니다.
보통 call stack은 main()부터 시작하며, #<번호> 부분으로 이동하기 위해서는 frame 명령어를 사용합니다. 예를 들어 "#1 -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]" 부분으로 이동하기 위해서는 "frame 1"과 같이 입력합니다. 또는, 현재 위치를 기준으로 +1 되어 있으므로 "up 1"를 입력하여도 됩니다.

"frame 1"로 입력하였을 경우 다음과 같이 현재 위치가 변경됩니다.

(gdb) frame 1
#1  0x30978386 in -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:] ()
(gdb)


이 상태에서 인자를 보고 싶을 때 일반 c application은 인자들이 목록에 나와서 display 명령어로 볼 수 있습니다.
이 때 주의할 점은 $ebp레지스터를 이용하기 때문에, 다른 frame의 값은 볼 수 없다는 것 입니다.

(gdb) frame 0
#0  0x3097263a in -[UIViewController setInterfaceOrientation:] ()
(gdb) display *(int *)($ebp + 16)
1: *(int *) ($ebp + 16) = 1
(gdb)


위와 같이 0 frame으로 변경한 뒤, setInterfaceOrientation:의 첫번째 인자를 보면 1로 표시됩니다.
$ebp는 함수 시작 시 설정되는($esp가 저장되어) stack의 시작 주소 이기 때문에 (int *)로 캐스팅 한 뒤 역참조 연산자인 *를 붙여서 정수 값을 출력 하였습니다.
 
일반 c 프로그램을 디버깅 할 때는 display가 유용하지만 Objective-C에서는 다른 방법으로 봐야 합니다. (display로 봐도 되긴 합니다)

(gdb) po _rootView
<UIView: 0xd1a650; frame = (0 0; 320 480); layer = <CALayer: 0xd1a680>>
(gdb)


display를 이용하면 다음과 같이 나옵니다.
(gdb) display _rootView
1: self->_rootView = (UIView *) 0xd1a650
(gdb) display *_rootView
2: *self->_rootView = {
  <UIResponder> = {
    <NSObject> = {
      isa = 0x31a5c620
    }, <No data fields>}, 
  members of UIView: 
  _layer = 0xd1a680, 
  _tapInfo = 0x0, 
  _gestureInfo = 0x0, 
  _gestureRecognizers = 0x0, 
  _charge = 0, 
  _tag = 0, 
  _viewFlags = {
    userInteractionDisabled = 0, 
    implementsDrawRect = 0, 
    implementsDidScroll = 0, 
    implementsMouseTracking = 0, 
    hasBackgroundColor = 0, 
    isOpaque = 1, 
    becomeFirstResponderWhenCapable = 0, 
    interceptMouseEvent = 0, 
    deallocating = 0, 
    debugFlash = 0, 
    debugSkippedSetNeedsDisplay = 0, 
    debugScheduledDisplayIsRequired = 0, 
    isInAWindow = 0, 
    isAncestorOfFirstResponder = 0, 
    dontAutoresizeSubviews = 0, 
    autoresizeMask = 0, 
    patternBackground = 0, 
    fixedBackgroundPattern = 0, 
    dontAnimate = 0, 
    superLayerIsView = 0, 
    layerKitPatternDrawing = 0, 
    multipleTouchEnabled = 0, 
    exclusiveTouch = 0, 
    hasViewController = 0, 
    needsDidAppearOrDisappear = 0, 
    gesturesEnabled = 1, 
    capturesDescendantTouches = 1, 
    deliversTouchesForGesturesToSuperview = 1, 
    chargeEnabled = 0, 
    skipsSubviewEnumeration = 0
  }
}
(gdb)


무엇인가 po가 더 간단해보이죠??? (장, 단점이 있습니다)

디버깅을 Xcode가 다 해준다지만.. 그래도 gdb 정도는 쓸 수 있어야겠죠???
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/06/11 12:55 2009/06/11 12:55
, ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/229

Objective-C에서 Singleton객체 만들기

Objective-C에서 Singleton 객체를 만드는방법은 다음과 같습니다.

//  SingletonClass.h

#import <Foundation/Foundation.h>

@interface SingletonClass : NSObject
{
}

+ (SingletonClass *)sharedSingletonClass;

@end


//  SingletonClass.m

#import "SingletonClass.h"

@implementation SingletonClass

+ (SingletonClass *)sharedSingletonClass
{
    static SingletonClass *singletonClass = nil;
    
    if(singletonClass == nil)
    {
        @synchronized(self)
        {
            if(singletonClass == nil)
            {
                singletonClass = [[self alloc] init];
            }
        }
    }
        
    return singletonClass;
}

@end


여기선 DCL(double-checked locking)을 사용하였는데, Objective-C에서도 최적화 과정에서 비교 구문의 instruction의 위치가 바뀐다면.. 엄밀히 말하면 100% 안전한 코드는 아니되겠습니다.


사용 방법은

SingletonClass *s = [SingletonClass sharedSingletonClass];


와 같이 하시면 됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/03/31 13:04 2009/03/31 13:04
,
Response
No Trackback , 8 Comments
RSS :
http://b4you.net/blog/rss/response/210

Objective-C 따라하기 - Hello World

Objective-C에서 Hello World를 출력해보겠습니다.
우선 main.m 파일을 생성한 뒤 다음 소스를 입력합니다:
#import <stdio.h>
int main(int argc, const char * argv[])
{
    printf("Hello World!\n");
    return 0;
}
Makefile를 작성합니다. 앞으로 모든 실습은 본 Makefile이 작성되어 있다고 가정하고 진행하겠습니다.

main: main.m
        gcc -x objective-c -Wno-import main.m -lobjc -o main
clean:
        rm main

make를 실행합니다.

[root@localhost objective-c]$ make
gcc -x objective-c -Wno-import main.m -lobjc -o main
[root@localhost objective-c]$

컴파일 된 결과를 실행 합니다.

[root@localhost objective-c]$ ./main
Hello World!
[root@localhost objective-c]$
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/02/24 11:15 2009/02/24 11:15
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/198

리눅스에서 gcc로 Objective-C 컴파일 하기

리눅스에서 objective-c를 컴파일 하기 위해서는 다음과 같은 명령어를 이용합니다:

gcc -x objective-c -Wno-import <.m파일 이름> -lobjc -o <output 파일 이름>

이것 역시 타 프로젝트에서의 gcc 사용 방법과 동일 하므로, .m 파일 이름 등을 적당히 수정하여 사용하시면 됩니다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2009/02/24 11:03 2009/02/24 11:03
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/197


블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

Calendar

«   2017/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Site Stats

Total hits:
1714552
Today:
3707
Yesterday:
3980