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へ値をコピーする。

movl

ありゃ?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 でアセンブラをいじってたなあ。あのエントリをじっくり読んでみようかな?

関連記事

サンフランシスコのピア39にあるチャウダーズでクラムチャウダーを食す!

lolipop アップルの開発者向けイベント「WWDC2014」

ミスドのカルピスドーナツとカルピスポンデリングを食べてみた!

ミスドで期間限定のカルピスコラボ商品「カルピスドーナツ」と「カルピ

十三カレー計画で牛すじカレーネギのせを食す!(大阪・十三)

「iPhoneアプリ開発キャンプ@大阪」のランチで、十三カレー計画

大阪・難波の加寿屋 法善寺でかすうどんを食す。ランチタイムはおにぎり2個まで無料!

大阪・難波の加寿屋 法善寺 (かすうどん KASUYA)で、かす

ライブドアブログで運営していた「あきお商店」を「卵は世界である」に改名しました

少し前からライブドアブログで「あきお商店」というブログをやって

→もっと見る

PAGE TOP ↑