objective-c や cocoa の割と独自仕様っぽいところ。
delegate
見かける割にいまいち理解できていなかったデリゲート。
「MTKView のデリゲートがレンダラー」と気がつき、ああそういうことかと納得。
大抵の場合、ViewController が MTKView を呼び出す前に
_view.delegate = _renderer;
などとしているはずだ。
メタルの表示用ビューとして MTKView は存在しているが、各アプリでのこのビューの使い方は様々だろうから、そこら辺は自分で DrawInMTKView を実装してね、プロトコルは準備しておくから・・・ということなんだと思う。
わかりにくくなるのは、プロトコルが明示されているわけではないので、その仕組みに気が付きにくいからじゃないでしょうか。
本来であれば以下のような記述が必要なようだ。
委譲する側(のヘッダ)
@protocol HogeDelegate
@property (weak, nonatomic) id delegate;
@protpcol HogeDelegate <NSObject>
-(void)FugaMethod;
@end
以下のように明示的にぶん投げるときもある。
委譲する側(の .m ファイル)
[self.delegate FugaMethod] //こうやって使うようだ
ぶん投げられる側はプロトコル準拠を明示しておく。
委譲される側(のヘッダ)
@interface Fuga: NSObject <HogeDelegate>
ところで、これが面白いのは、ある種の情報の通知として利用できる点。
上の例なら、Hoge の情報を Fuga で受けられる。
ViewerController に受け持たせてしまい、あるオブジェクトでの情報をビューに反映させるといった使い方ができる。
参考:https://dev.classmethod.jp/articles/ios-delegate/
マルチスレッド処理
NSTread を使う方法、dispatch_async – queue の系を使う方法などいくつかあるようだ。
(続く)
KVO
https://qiita.com/mitsu9/items/e738c41a8d87cc71ec3e
KVOとはキー値監視(Key-Value Observing)のことを指します。
アプリ開発をかじったことのある人ならMVCという言葉を聞いたことがあると思いますが、KVOはModelの変更をControllerやViewに通知し、反映させるための仕組みです。
他の通知システムとしてはdelegateやNSNotificationを利用した方法などがあります。
なるほど。
サンプルとして MCV を意識したメモアプリあり。
インスタンス変数の宣言
『Objective-Cでは、インスタンス変数をどこに宣言するのが正しいのか? 』が興味深かった。
やはり、みなさん疑問に思っていたんですね。
参考
phorlix100 の github issues 。
いやー、大変参考になりました!