CoCoaのキメラっぷり

NSObject派生のオブジェクトと、ただの構造体とが混在してるのがまず気持ち悪い。
WindowsのWM_PAINTやOnDrawに当たる「再描画」のセレクタがUIView>>drawRect:(CGRect)としてあるのですが、これからして妙です。
再描画のくせに「drawRect」という不思議な名前なのは、この際我慢するにしても、引数で渡されるダーティレクタングルの表現が「CGRect」という「構造体」の「実体」だという時点で妙な気分です。
いやま、元になったCもANSIで標準化されたときに引数に実体のコピーを渡したり、「=」でメンバ全体をコピーしたりという拡張が標準になりましたが、それでもコピーコストを考えると参照が当然だろう、と。
その上、構造体の初期化関数なんてのがあって、

CGRect aRect=CGRectMake(0,0,100,100);

みたいな書き方が推奨されてるのも気持ち悪い(ポインタじゃないのがみそ)。だいたい、そのCGRectMakeの指し示す実体ってどこなんだよ。それ破棄しないでメモリリークしないの? しないのならstaticな領域かなぁ、だとしたらスレッドセーフじゃないんじゃ……とかなり座りが悪いです。


それ以前に、メッセージ式にオブジェクト以外の物が渡ってくるのも気持ち悪いです。さっきのdrawRect:なんか引数はオブジェクトどころか構造体だし。

[@"hoge" drawAtPoint: CGPointMake(0,0)];

はできるのに、

[CGRectMake(0,0,100,100) drawAtPoint:CGPointMake(0,0)];

は出来ない(構造体だからレシーバになれない)のもどうにかならんもんか。そもそも1番目の書き方には描画コンテキストへの参照がないので、どこに書いてるのやらって感じ。いや、UIView何だから、Viewに対する描画なんでしょうけど。
結果的にdrawRect:メソッドは描画コンテキストを使ったCの関数とメッセージ式が混在するという不思議な作りになります。これ、Smalltalkから引き継いだ部分と、そうじゃない部分が混在してるんだろうなぁ。NSString>>drawAtPoint:なんか、いかにもSmalltalkだもんなー。
ともあれ、AndroidやWindowsMobileよりもユーザー多いのでiPhoneに向けても作ります。はい。がんばって。