IOSプロジェクトの中身をガン見する! | ゲームプログラマ志望が福岡で叫ぶ 『絶望』

ゲームプログラマ志望が福岡で叫ぶ 『絶望』

プログラマーになりたい!!!!! あ、風のうわさで聞いた最近若者で流行っているトゥイッターなるものを始めてみました (・ト・) @toshi_desu_yo

はい次々~~~

詰まってるから早めにどんどんリファレンス読んでいく!!!
しかし記憶できるかはまた別だけどな!!



*************************************************************************************************************************************

============【 IOSアプリケーションプログラミングガイド 】============

*************************************************************************************************************************************

を読んでいってみる。

アプリ制作においての設計や方向性のアイデアを教えてくれるっぽいですね。
どんなアプリを作りたいか。そのためにはどの機能を使ってどういうふうに作り上げていけばいいか。
iPhoneプログラムからはじめる初心者のかた向けっぽいですね。
教えてくれるというので是が非でも学んで野郎じゃねぇか馬鹿野郎!!!《゚Д゚》


あ、ちなみに今回はかなり省きます(笑)

これ200ページくらいあるんだけどwwwwwwww多いなwwww
途中から作りながら覚えていく



◎アプリケーションの中核を成す UIKit
IOSアプリの中核は UIKitフレームワークのオブジェクトから構築されます。
イベント処理から画面への表示、様々なシステムとの連動まで提供します。
まずは UIKit から勉強しましょう!


UIKitはあらゆるアプリケーションの基盤です。
UIKITがアプリケーションのイベントループも担当しているらしい。
※イベントループ : 中でぐるぐる回っており、タッチイベントや加速度センサに反応があった時指定された場所を呼び出す。
 ループしている場所が見えない。


アプリケーションの中心は UIApplicationオブジェクトです。




ほ~ん(´・∀・`)ヘー
ここからはアプリを実際に見ていきながらあわせてpdf読んでいく形にしてみる。
ソッチのほうが覚えやすいと思う(多分、恐らく)





-------------------------------------------------------------------------------------------------------------------------------------


「XCode」 -> 「File」->「new」 ->「project」この中の『 Single View Application 』テンプレートを選んでみる。
このテンプレートは1つのViewとそれを管理するViewController、それと、

設定を行えば視覚的に画面を構築できるストーリーボード、もしくはnibファイルが含まれるらしい。



Viewとは画面に描画されるものらしい。
アプリでよく見るボタンやテキストを入力するところもViewだとか。
タッチイベントもこいつが受け付ける。だからボタンViewの上をタッチすればボタンがタッチされたと理解できる。

そしてこいつらを貼り付けれるコントロールと呼ばれるViewが1つあり、(こいつはViewControllerが持っている)
その上に他のViewをぺたぺた貼っていく。
そして最終的にコントロールViewをウィンドウに貼り付けるとその上に貼り付けられたViewごと画面に描画される。。


ViewControllerはViewを管理する所。
こいつが描画するViewを切り替えたり、保持するViewを生成や、破棄したりするとかなんとか。。



ほぉ! すげーな!!(ノ´∀`*)
(よくわかってない)


全て開いてみた ↓

作成する時に「Device」のところを「Universal」にして作成してしまったのでストーリーボードもiPhoneとiPadの二種類できてます。



AppDelegateとやらは後から見るとして「Supporting Files」の中身に我らC信者が見慣れてるものが!!!!!




main 様がぁ~・・・ いたぁ~・・・

IOSはObjective-CというCの派生言語って言ってたし、やっぱりmainから始まるのだろう。
main様↓


まず早速見慣れない @autoreleasepool とやらが。
文字からしてこのカッコで囲んだところのメモリをカッコが終わる時に全て削除するものだと思う。
※ ARC(自動参照カウント)を選択すると現れるそうです。

ARCにするとメモリの開放をコンパイラが自動的にしてくれるらすぃ。
今まで書いていた [ ~~~ release ] autorelease を書くとエラーになったのはそのためですか。




気になるのは


UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

の部分。

この関数が UIApplication を作成してイベントループを回すように連絡しているもの!    のはず,,,,。


1, 2番目の引数はコマンドラインからの何かしらの情報が入っている。  のはわかる。
3番目の引数は呼び出されるUIApplicationの名前を指定するらしい。nilだと "UIApplication" になる。




nil だとデフォルトのUIApplicationを呼び出すということになるのかな。 ????


4番目の引数は生成するアプリケーションデリゲートとやらの名前を渡すらしい。
ここがnilだと nib ファイルに関連付けてある アプリケーションデリゲートやらを読み込む。

でも今回はストーリーボードなので引数にちゃんと名前を指定してあるのかな。


次に見慣れない関数。

NSStringFromClass -
 クラスの名前を NSString型 で返す関数。

(例) ↓

@interface TestA : NSObject;
/** なんか変数 **/
@end

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

NSObject* pObject = [ TestA alloc ];
NSLog( @" pObjectの本当の正体は!! %@ です ",  NSStringFromClass( [ pObject class ] ) );


【結果】
2012-10-02 17:20:32.556 Test01[59502:c07]   pObjectの本当の正体は!! TestA です 



おぉー! なるほどー!! となっただけです。はい。
つまり、呼び出したいAppDelegate名を書けばいいんですね。はい。


本題に戻ると、 UIApplicationMain で、
イベントの処理やフォアグラウンド、バックグラウンドの画面遷移を行うアプリケーションデリゲートを生成しているわけですね。

で、UIApplicationクラスでずっとイベントループを繰り返して、
UIApplicationクラスが終了すると @autoreleasepool でメモリが開放されてmain関数が終わると。



次に AppDelegate を見ていく!
さぁ! 隅々まで見せてもらおうか!! グヘヘ

ヘッダー ↓



UIResponder -
 画面タッチや加速度センサなどのイベントを受け取れるUIKitクラス。
 これを継承することで同じ機能を得られる。


で、:の右に書いてるというのは継承かなと大体の見当はつくのですが、
次の < > に囲まれた UIApplicationDelegate はなんぞや! と。

デリゲートというのは日本語で「委託」という意味で、これを別のオブジェクトに渡すと自分では処理をしない機能を渡せるらしい。


UIApplication自体は起動時の初期化、画面遷移等をしてくれるありがたい存在ということはわかります。
しかし、< > の意味がわからないと。 そしてDelegate。


調べた所。
 <UIApplicationDelegate>であれば、UIApplicationの機能を追加することらしい。    
 なので今回の場合、UIApplicationの一部の機能をAppDelegateが置き換える。

 UIApplicationで使用する関数を  <UIApplicationDelegate> をしているクラス( つまりAppDelegateクラス )が代わりに中身を書き、
 このAppDelegateクラスに ”お前UIApplicationな!” と言ってUIApplicationとしてクラスを生成してあげると、
 システムがUIApplicationの関数名を呼び出すと、 AppDalegate に書いた関数が呼び出される。
 

・・・・・


C++ でいう仮想継承じゃーん............ (多分)

後ろのdelegateは仮想クラスって意味か。 今回だと UIApplication の仮想クラスを継承してね!☆彡 か。
後、Objective-Cでは多重継承ができないんですと。 だから仮想継承を沢山作るわけか。 


仮想継承とはつまり、< > の中に書いたクラスの皮をかぶれるということですな!
皮をかぶりソイツになりきれる。包茎///

継承では親の変数も引き継げる
仮想継承は親の関数情報( 関数の中身はない )しか引き継げない。継承先で関数の中身を書く。
結局、UIApplicationMain関数ではUIApplicationの役目を果たすAppDelegateクラスを呼び出してるのか。





取り敢えず曖昧だけどこんな感じじゃないかな?w 途中で思っていたものと違う動作をしたらまた調べる。

で、次は

@property( strong, nonatomic) UIWindow *window;



@propertyはアクセサメソッドを自動で作成する。
※アクセサメソッド -
 GetterとSetter!! 

 

指定した変数の


-( void ) SetWindow:( UIWindow* )pWindow
{
        if ( window != pWindow )
        {
              [ window release ];
               window = pWindow;
        }
}
-( void ) GetWindow
{
        return window;
}


みたいなprivateな変数をアクセス出来るように関数を作るのが一々だるい場合は使用する といいのか。


strong -
 強い参照。 ARCにより追加された。
 strong指定するといろんな所にその変数を渡した時、元々保持していたクラスが破棄されても1つでもこの変数を持ったクラスがある限り生き残り続ける。
 そう!俺は生命力が強いんだ!! ってこと?( ゚д゚ )

反対にweakもあり、

weak -
 こちらは弱い参照。
 元々保持しているクラスがいなくなったら、他のクラスが保持していても これを指定した変数もメモリから抹消される。


らしい。
使い方によってweakとstrongを使い分けないとメモリ参照エラーや破棄されないオブジェクトが溢れかえりそう。。。
後1つのnoatomicは、

nonatomic - 

 マルチスレッドにおいてスレッドセーフ(同時に同じ変数にアクセスしないことを保証する)を自動でしてくれるのを解除する。。のかな?w
 で、シングルスレッドなのにスレッドセーフを保証するのは速度の無駄!
 だということでそれを破棄している感じ! だと思う


ちなみに @property書かなければその変数は strong になるらしいです。デフォルトがstrong。

へー 他にもあるらしいけど取り敢えずこれだけ知ってればいい感じだ。
というかプロパティ関数ぐらい自分で書くわー・・・。



次に AppDelegate.m を見ていく!



なんにもねぇええええええええええええええええ!!!!!!!!!!!
OH! イングリーッシュ!!!!

びっくりするほどなんもねぇ・・・
あれ? ViewControllerの生成とかどうしてんだ・・・((((;゚Д゚))))


と、思ってストーリーボード、ARCを使用しないプロジェクトをもう一つ作って AppDelegate.m の中身を見てみた。


あらぁー。 これはこれでめんどくさくなりましたわね(ノ´∀`*)


まずは、このデリゲートクラスの関数が何のためにあるか書いてあったので・・・書く!


willFinishLaunchingWithOptions -
  アプリケーション起動後、最初に実行される。

didFinishLaunchingWithOptions - 
  アプリケーションが画面を表示する直前に実行される。最後の初期化処理を記述すると良い

applicationWillResignActive - 
  フォアグラウンド状態から抜けようとしている際に呼び出される。
  ゲームを一時中断状態にするための処理を書くと良い(中断セーブとか。)

applicationDidEnterBackground -
  バックグラウンド状態で動作しており、いつでも一時停止状態になるうることを表している。

applicationWillEnterForeground - 
  バックグラウンド状態から抜けつつあるけども、アクティブになっていない時に入ってくる。

applicationWillTerminate -
  アプリケーションがもうすぐ停止することを表します。
  一時停止状態であればこのメソッドは呼び出されません。

ホームボタンを押されてアプリケーションがバックグラウンド行く前に、お願いすれば5秒時間をもらえるらしい。
その間に中断セーブやら、メモリを圧迫しないようにモデルの破棄やらしろってことだな。
5秒以上は待ってくれないらしいww強制BAN!( ‘д‘⊂彡☆))Д´) パーン



で、恐らくストーリーボードを使用する場合ストーリーボード自体にWindowとそれに貼るViewと最初に読み込まれるViewControllerが組み込まれているはず。
そしてストーリーボードはViewController間の画面遷移を容易に自動的に行なってくれるので
AppDelegateにもViewControllerにも画面遷移する記述が無いわけか。

後はストーリーボードで設定しろぃ! 
 しかしバックグラウンドに行くときはここを見ろよ!後はViewControllerに任せた!!


という感じか( ゚д゚ )


ViewやViewControllerは長くなりそうなのでまた今度見るとして、後の .plist ファイルやら 変な画像ファイルやらを見ていく。
こいつらは・・・・

↓の画像を見てください!!
(決してめんどくさいからではない!!)

設定ファイルとアイコン等の初期画像らしいですね。
ココらへんは開発の最後らへんでお世話になりそう。



長くなったのでまた次に書きたいと思います。
後はメモ↓


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



・UIApplicationオブジェクト
 イベントループの管理。イベントの管理。 

・「アプリケーションデリゲート」オブジェクト
 mainエントリポイントからUIApplicationMain関数で生成されるオブジェクトです。
 起動時の初期化、状態遷移を管理します。
 UIResponderを継承すればイベントの処理もできるようになりました。
 
・ViewControllerオブジェクト
 ViewとViewを継承したオブジェクトを管理し、管理しているViewをウィンドウ上に埋め込んで画面描画します。

・UIWIndow
 埋め込まれたViewを表示する場所を提供します。
 表示内容を切り替えるときはその時メインで管理しているViewControllerのViewを切り替えます。
 ウィンドウは切り替えるものではありません。
 UIApplicationオブジェクトと連携してViewやViewControllerにイベントを配信する役割もあります。
 
・View
 画面に描画されるものを提供します。ボタンやテキストフィールド等もViewの1つ。
 指定された矩形領域に何らかを描画するもの。 ボタンViewであればボタンが指定した場所に描画される。
 領域内で発生したイベントを受け付けます。

・レイヤオブジェクト
 実際に描画される場所。Viewの内容はレイヤに描画しています。
 


◎カスタムデータモデルの定義
システムが提供するデータ型を活用するべし。 Foundationフレームワークが持っている。
開発時間短縮に役立つでしょう。

・文字列、テキスト
 NSString、NSAttributedString - IOSはUnicodeベースです。

・数値を格納
 NSNumber - 整数値、浮動小数点値、ブール値、char型を表します。
 NSIndexPath - 一連の数値を格納し、配列になっている。

・生のバイト列
 NSDate - 生のバイトストリームを格納したい時に使用します。バイナリファイル。
 NSValue - 標準的なデータ型を格納するために使用します。

・日時と時刻
 NSDate - 時刻に関係する情報が格納されている。 
 NSDateComponents - こちらも時間の情報が入るが、違いはカレンダーと同期する所で、
  時間を日数で加算したり、
  2つ日時を指定してその2つの日時の差(時間)を求めたり出来る。

・NSURL -
 ネットワーク関連、およびファイルのパスを設定取得する機能もあります。

【配列】
・NSArray - NSObjectを継承したオブジェクトを配列で格納するオブジェクトです。
      頭から0,1,2,,,が割り振られます。
・NSDictionary - こちらはキーを自分で設定します。
・NSIndexSet - 整数型の配列。
・NSSet - ある集合の中に任意の要素が入っているか、入っていないかの判定に使用する。
     順不同なので中身がバラバラに格納されている。
・NSOrderedSet - NSSetに順序情報を追加したバージョン。

(上記の集合オブジェクトのNSの後にMutableを付けると、可変的になる。"後から情報を追加できるようになる")


他にもよく使われるデータ型で

・NSInteger / NSUInteger - 符号付き/符号なしの整数。
・NSRange - NSStringの中の指定した数の文字を取り出す時等に使用する。
・NSTimeInterval - 時間の感覚を表す秒数
・CGPoint - x, y 座標。
・CGSize - w, h の大きさ。
・CGRect - x, y, w, h が格納できる。




ここまで来たら後は作りながら調べて覚えて行こうかなと思います。


【結論】
むずい