はじめに
こんにちは、@hiro128_777です。
iOSDC で 以下の通り Xamarin.iOS の仕組みについてお話させていただきました。
www.youtube.com
ですが、時間が足りなくて話しきれなかったことが多いので、blog でもう少しこの話題を掘り下げて説明していこうと思います。
iOS アプリのアーキテクチャーについてはこちらの公式ドキュメントも是非ご参照ください。
docs.microsoft.com
Xamarin.iOS は「攻めた設計」で「禁断の果実」に手を出している
今まで Windows アプリを開発者していた方が Xamarin.iOS を使い始めたとき多くの方がぶつかるトラブルがメモリーリークです。では、なぜ Xamarin.iOS はメモリーリークしやすいのでしょうか。 それは、Xamarin.iOS が「禁断の果実」に手を出しているからです。「禁断の果実」とは、.NET と Objective-C との相互運用です。これを実現するために、「攻めた設計」で、様々な「無理」をしているために、このような問題が起きてしまいます。
下の図を見てください。Xamarin.iOS では、ユーザが明示的に、バインディングによって C# から iOS API を利用することができ、逆に、Objective-C ランタイム側からも、mono ランタイム上で動く C# で書いたメソッドをコールしたりプロパティにアクセスさせることができます。
この相互運用機能を実現したことが「攻めた設計」であり、「禁断の果実」と言えます。
ですが、決して Xamarin.iOS の設計が間違っているわけではありません。そこにはトラブルの起きやすさと引き換えに手に入れた、便利な機能があります。そういう意味で、Xamarin.iOS を効果的に使うにはしっかり仕組みを理解することが必要となります。しっかりと理解して利用すればトラブルは発生しませんが、完全に使いこなすにはかなり深いところまでを理解する必要があるため、これまで Xamarin.iOS を使ってきた総仕上げとして知る限りのことを記録できればと考えています。
Xamarin.iOS の優れている点
iOS の OEM Widgets や API をすべて利用でき、しかも .NET の機能も織り交ぜながら、機能拡張できます。
iOS の OEM Widgets の機能を .NET の機能も織り交ぜながら、拡張できるのはとても強力です。できることの幅がとても広がります。難易度は別として Xamarin.iOS に起因して何かができなくなることはまずありません。ちょっとした便利機能を追加するのも簡単ですし、各種 MVVM のライブラリや Rx のライブラリ等自分の好みの機能を追加して利用することができます。また、View Model や Model と上手く連携することで、Xamarin の本領である Android との共通化にも大きく寄与します。
Xamarin.iOS の使いにくい点
自由度が高いため、よく理解していないで使うと、かえって負債を産んでしまいます。
ネイティブでできることはほぼ全部できるのと同時に、そこに .NET も混ぜることができるので、非常に複雑化しやすくなります。しっかり考えて使わないとグチャグチャな構造になり、手が付けられなくなります。
使い方を間違えるとメモリーリークやイベントの破壊などが起きる仕様を抱えています。
これは相互運用を行わず、Objective-C ランタイムの中の閉じた世界とすれば、このような問題も起こりませんでした。
まとめ
Xamarin.iOS は効果も問題点もすべてを理解して使わないとその実力を発揮できません。
苦労も多いですが、C# ユーザーが、iOS のアプリを書きたいときに知らない言語、知らない OS、知らない API で始めるのがつらい場合、チャレンジする価値は十分にあります。なぜなら、.NET が簡単すぎるだけで、Xamarin.iOS でおこるメモリーリークなどのトラブルは色々なプログラム言語を習得していけば普通に遭遇する事象であり、特別なものではありません。よって、それをこの機会にしっかり理解しておけば他の言語などを理解するときにとても役に立つからです。
今回は以上となります。
次回はこちらです。
hiro128.hatenablog.jp