さすがに2009年のiPhone SDK 3の内容と比べると色々変わってるか・・・

今日も今日とてiPhoneDev。
http://journal.mycom.co.jp/column/iphone/019/index.html
タワーディフェンスのチュートリアルを発見!
垂涎の思いでオープンして、早速取り掛かってみよう!と思いきや、思わぬ罠に引っかかってしまいました。
現行のSDKと当時のSDKのスケルトンコードの内容がかなり違う様なのです。
当然2009年ですからiPhone3GSが出てきたばかりで、まだ初代iPhone、iPhone3も現役の頃。
OpenGLES2.0をサポートしていないこの二つのデバイスの為に、それらをサポートするクラスもあるわけです。


所が今やそんなクラスはかけらもありません・・・

EAGLViewクラスの、initWithCoder:メソッドを、以下のように変更しておく。

// 常にES1Rendererを使用する
#if 1
        renderer = [[ES1Renderer alloc] init];
#else
        renderer = [[ES2Renderer alloc] init];
#endif
http://journal.mycom.co.jp/column/iphone/019/index.html

と出てきたときにむぅ?っと思ったんだよなぁ・・・
なんか足りないぞと・・・


まぁいいやこんなんで躓いては居られない
会社のれがしーすぱげっちぃこーど(switch一つで4000行とか)を読んでる訳じゃないんだなんとかしてみせる!
・・・それにしても一度作り上げたコードを態々XCode4用に作り直してくださっているもとまかさんには感謝したりないなぁ。

Objective-Cってメソッド名をそんなに重要視しないのでしょうか・・・?

今日までは取り合えずモチベーションを上げる為にiPhoneで何が作れるのかと言うのをやってきましたが、そろそろ基礎もやっておかねば。と言う事で今日はObjective-Cのシンタックスなんかを勉強しようと思います。

と言うのも一昨昨日に作ったジャンケンアプリで、纏めて.hiddenの状態を変化させる為にメソッドを作ろうとしたら何故かコール出来なかったと言うのが非常に悔しかったのです。

その時作ったメソッドが以下:

- (void) ButtonHiddenStatus : (BOOL) paperHidden : (BOOL) scissorHidden : (BOOL) rockHidden : (BOOL) againHidden
{
    paperButton.hidden      = paperHidden;
    scissorButton.hidden    = scissorHidden;
    rockButton.hidden       = rockHidden;
    againButton.hidden      = againHidden;
}

でメソッド実行で ButtonHiddenStatus(true, true, false, true) とかやってたんですけどまぁ当然の事ながらエラーなわけです。
お恥ずかしい。

[self ButtonHiddenStatus:true :true :true :true];

が正しい用法なのです。


で、ただ恥を晒すだけなのもなんなので自分的に面白いと思った事などを。

Objective-Cのメソッド定義の構文は、メッセージ式の記述が明解になるように考えられています。自分でメソッドを定義するときにも、メッセージ式でどのように表現されるかをイメージしながらネーミングするといいかもしれません。

Objective-Cのクラス定義を理解しよう (2/3):Cocoaの素、Objective-Cを知ろう(3) - @IT


なるほど私のメソッドは開発者の意図から少々離れていた模様です。
本当ならば実装は

- (void) patternHidden:(BOOL)paraPaperHidden scissorHidden:(BOOL)paraScissorHidden rockHidden:(BOOL)paraRockHidden againHidden:(BOOL)paraAgainHidden
{
    paperButton.hidden      = paraPaperHidden;
    scissorButton.hidden    = paraScissorHidden;
    rockButton.hidden       = paraRockHidden;
    againButton.hidden      = paraAgainHidden;
}

で、実行は

[self patternHidden:true scissorHidden:true rockHidden:true againHidden:true];

が正しいと言えるのでしょう。
なんだかPropertyでも設定している感覚ですね。


この構文はなるほどメソッド実行時にかなり分かりやすくなるであろう事は明確です。
Intellisenseのまともに働かない環境下では非常に分かりやすいコードにもなるでしょう。
ただ、

- (void)ButtonHiddenStatus patternHidden:(BOOL)paraPaperHidden scissorHidden:(BOOL)paraScissorHidden rockHidden:(BOOL)paraRockHidden againHidden:(BOOL)paraAgainHidden

と矢張り一番最初にはメソッド名を入れたくなってしまうのは他の言語から来た皆様も通った道なのでしょうか・・・

皆大好きstack overflow

iphone - iphoneSDK: UINavigationController Back button is causing app to crash - Stack Overflow
これが原因でした。
ポインタ関連はC#ばっかやってたから疎かになってるな。
リリースのタイミングとかGCに頼ってると全然気にしないもんなぁ・・・
そう言う意味では作りたい物の本質についてのみ考えていられると言う意味ではC#/Javaは優れているんだなぁ。
と。言い訳せずに勉強し直そうっと。

iPhoneアプリの基礎。Navigation-Based Applicationを作ってみよう。

http://d.hatena.ne.jp/moto_maka/20110506/1304623238
今日も今日とてチュートリアルにて勉強中。
丁度今日もとまかさんのiPhoneチュートリアルが更新されたのでポチポチと。
今日のチュートリアルはコーディングが主体なので本領発揮です。
とは言っても未だにObjective-Cのシンタックスに四苦八苦しているのですが(笑


最後の部分にてどんなUIViewControllerも
[self.navigationController pushViewController:「UIViewController名」 animated: true]
となるのだから色々なUIViewControllerを作って一つのUIViewController*とswitchでの代入だけやればコード上の管理が楽だろうなと思って改造してみたのだけれど、WebViewControllerからRootViewControllerに戻ってくる時にクラッシュしてしまう・・・
別のTableViewに入ってまた戻ってくる時は問題無いんだけどなぁ?


追記:いや違うや。
クラッシュするのはまだページがロードされている途中でRootに戻った場合だ。
こう言うのはどうやって回避するんだろう?

ブラウザを作ってみよう。

http://d.hatena.ne.jp/moto_maka/20110418/1303067937
又ももとまかさんのiPhoneチュートリアル。
こう言うリファレンスがあるのは非常にありがたいですね。
URLの入力フィールドをテクストフィールドでやる方法を後で探してみよう。
目指せサファリのUI!

Interface Builderが楽しすぎる

XCodeもVisual Studio並みのIntellisenseが備わってきているのかも。
InterfaceBuilderのアウトレットとオブジェクト繋ぐのがかなり楽しい・・・
この感覚はかなり重要ですよね。


追記1:あー宣言をダブルクリックすると勝手に定義してくれるのが無いのが微妙に不便・・・
Spoilされてるのが露見しまくりです。
追記2:おお、このCounterPartって言うのが勝手に.hを開いてくれるのは嬉しいかも。
追記3:Objective-Cのシンタックスに慣れないなぁ。色々常識(と思っていた物)を破壊しなきゃ。