Objective-Cにおける[]内でのキャストは、C++のキャストと同等の動作なのか?
公開日:
:
最終更新日:2012/12/14
Objective-C
こんなコードがある。
selectionLayer.position = [
(CALayer*)[[menusLayer sublayers]
objectAtIndex:selectedIndex] position];
なるほどー。[]でもC++みたいにキャストできるのねー。いや、待てよ。この記述はC++のキャストと同等の動作をするのかな?という訳で、調査開始。
テストコードを書く
[(CALayer*)[[menusLayer sublayers] objectAtIndex:selectedIndex] position];
CALayer* p = (CALayer*)[[menusLayer sublayers] objectAtIndex:selectedIndex];
[p position];
この2つを比較してみよう。
アセンブラコードの表示
Xcodeで[ビルド] -> [アセンブラコードの表示]を選択。
[(CALayer*)[[menusLayer sublayers] objectAtIndex:selectedIndex] position];
に対応するのは、以下のコードっぽい。
LM73:
movl 84(%esi), %edx
movl L_OBJC_SELECTOR_REFERENCES_64, %eax
movl %edx, (%esp)
movl %eax, 4(%esp) ; L_OBJC_SELECTOR_REFERENCES_64
call L_objc_msgSend$stub
movl 80(%esi), %edx
movl %edx, 8(%esp)
movl L_OBJC_SELECTOR_REFERENCES_18, %edx
movl %eax, (%esp)
movl %edx, 4(%esp) ; L_OBJC_SELECTOR_REFERENCES_18
call L_objc_msgSend$stub
movl L_OBJC_SELECTOR_REFERENCES_65, %edx
movl %edx, 4(%esp) ; L_OBJC_SELECTOR_REFERENCES_65
movl %eax, (%esp)
call L_objc_msgSend$stub
CALayer* p = (CALayer*)[[menusLayer sublayers] objectAtIndex:selectedIndex];
[p position];
に対応するのは、以下のコードっぽい。
LM74:
movl 84(%esi), %edx
movl L_OBJC_SELECTOR_REFERENCES_64, %eax
movl %edx, (%esp)
movl %eax, 4(%esp) ; L_OBJC_SELECTOR_REFERENCES_64
call L_objc_msgSend$stub
movl 80(%esi), %edx
movl %edx, 8(%esp)
movl L_OBJC_SELECTOR_REFERENCES_18, %edx
movl %eax, (%esp)
movl %edx, 4(%esp) ; L_OBJC_SELECTOR_REFERENCES_18
call L_objc_msgSend$stub
movl %eax, %ebx
LVL11:
LM75:
movl L_OBJC_SELECTOR_REFERENCES_65, %eax
movl %ebx, (%esp)
movl %eax, 4(%esp) ; L_OBJC_SELECTOR_REFERENCES_65
call L_objc_msgSend$stub
movl
movl %esp, %ebp
%espから%ebpへ値をコピーする。
ありゃ?mov命令とはコピー方向が逆??
positionの呼び出し部分を比較する
L_OBJC_METH_VAR_NAME_9:
.ascii "position\0"
L_OBJC_SELECTOR_REFERENCES_65:
.long L_OBJC_METH_VAR_NAME_9
.objc_class
.align 5
上記の部分があることから、positionをコールしているのは以下の部分っぽい。
movl L_OBJC_SELECTOR_REFERENCES_65, %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call L_objc_msgSend$stub
movl L_OBJC_SELECTOR_REFERENCES_65, %eax
movl %ebx, (%esp)
movl %eax, 4(%esp)
call L_objc_msgSend$stub
- (4%esp)はpositionのメソッドセレクタ?
- (%esp)がインスタンス?
っぽい。うーん、これじゃあ「[]内でキャストしても、C++のキャストと同等の動作をするのか?」という疑問の回答が得られない?もっとシンプルなコードを書いて、デバッガで追っかけたりしたほうがいいかな?
そういえば
id:amachang:20080328 で Mac OS X でアセンブラをいじってたなあ。あのエントリをじっくり読んでみようかな?