LispでZeroMQを試してみたが、今度はiOSからも試してみた。exceptionがあるのでiPhoneアプリに組み込んでもソースは公開しなくて大丈夫なはず。ビルドできるようになっているが、iPhone用にクロスコンパイルをするためには適切なオプションを与えてやる必要がある。一応、本家サイト上にもドキュメントはあるが最新のXcodeではうごかない。シミュレータ用でもうごかせるようにしておきたい。いうわけで、以下のようなビルドスクリプトを書いた。これをZeroMQのtarを展開してできたディレクトリにbuild.shとかで保存して実行すると、armv7とi386に対応したlibzmq.aができる。libraryこのlibzmq.aと、includeディレクトリの中身をXcodeにインポートしてやればよい。追加してやるのを忘れないように。ZeroMQを用いた簡易チャットアプリサンプルとしてチャットアプリを実装してみる。チャットでの発言はREQ/REPを用いてアプリ→サーバに渡し、PUB/SUBを用いてサーバ→アプリにブロードキャストする。rep-sockから発言を受け取ってpub-sockにそのまま流すだけ。msg))))))))(pull-and-publish)REQ/REPではなくPULL/PUSHでもできるはずだが、なぜかcl-zmqではpullがつかえなかったのでREQ/REPをつかった。アプリ側objective-c版ZeroMQもあるけど、今回はそのままCのAPIを利用した。簡単のためタイマーで1秒ごとにソケットにメッセージがあるかどうかobserveSocketでチェックしているが、別スレッドにしたほうがスマートzmq_recvのマニュアルによると、zmq_recvをZMQ_NOBLOCKで呼んだときにメッセージがなかった場合はEAGAINが返るとなっているが、-1がかえってきていた。2.0から導入された。iOSの実行環境には含まれない。Xでなら使えるらしい。Countingretainは参照カウントを1あげる。releaseは1さげる参照カウントが0でdeallocするとすぐに削除されるNSMutableArrayのaddObjectやremoveObjectAtIndexなどはオブジェクトの参照カウントを増減させる。(ARC)システムが自動的に参照カウントをしてくれる。強い変数と弱い変数がある強い変数デフォルトでは、オブジェクトのポインタは強い変数。そのようなポインタにアサインした参照は自動的にretainされる。キーワードをつかって明示的に強い変数を宣言できる。循環参照している場合や、しても開放されるようにするときに使える。親が子の強い参照を持っており、子が親の弱い参照を持っている場合、retainのサイクルが形成されなくなるのでオブジェクトを開放できる。_weakキーワードを使う。mutableCopyをprefixにもつメソッドはそのオブジェクトの所有権を返す、というネーミングコンベンションに従っている場合は自動的にARCが適用される。名前のコンベンションとは関係なしに、明示的にオブジェクトの所有権を返すメソッドをコンパイラに伝える方法もある。|プロトコルとはクラス間で共有するメソッドのリスト。javaでいうinterfaceのようなもの。@optionalディレクティブ以降のメソッドは実装が任意。@requiredディレクティブで必須。プロトコルに必要なメソッドは直接そのクラスで実装してもいいし、継承元の親クラスで実装してもよい。requiredがすべて実装されていなかった場合、コンパイラーはワーニングを出す。(エラーではない)すべてのrequiredメソッドを実装したクラスはそのプロトコルにconform(もしくはadopt)したという。そのオブジェクトがconformしているかどうかチェックするには、conformsToProtocolメソッドを使う。そのオブジェクトがoptionalなメソッドを実装しているかどうかをチェックするには、respondsToSelectorを使う。コンパイル時に型チェックが行われる。型宣言にを含めるとよい。カテゴリもプロトコルにadoptできる。プロトコルの名前はユニークでなければならない。delegationとはプロトコルで定義されたメソッドを実装したクラスを定義すること。protocolというものもあるが、これは単に実装がないカテゴリのこと。protocolともいう。ドキュメンテーションやモジュラリティのために用いる。コンパイル時チェックはなし。2.0で追加されたので、こちらをつかえばよい。|objective-cではカテゴリという機能を使ってクラスの拡張ができる。javascriptのprototypeのようなもの。上書きしたメソッドにアクセスする方法はない。メソッドを上書きする必要がある場合はサブクラスとして実装するべき。プライベートメソッドは無名カテゴリを使って実装できる。別の名前のカテゴリでもメソッド名は一意にしなければならない。別のカテゴリとの間にメソッド名でコンフリクトが発生した場合、どちらが呼ばれるかは未定義。カテゴリ名自体にソースコード上での可読性以上の実質的な意味は無いらしい。