個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Xamarin.iOS Deep Dive その1 Xamarin.iOS の特徴

はじめに


こんにちは、@hiro128_777です。
iOSDC で 以下の通り Xamarin.iOS の仕組みについてお話させていただきました。


www.slideshare.net
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# で書いたメソッドをコールしたりプロパティにアクセスさせることができます。


f:id:hiro128:20190918194901p:plain


この相互運用機能を実現したことが「攻めた設計」であり、「禁断の果実」と言えます。


ですが、決して Xamarin.iOS の設計が間違っているわけではありません。そこにはトラブルの起きやすさと引き換えに手に入れた、便利な機能があります。そういう意味で、Xamarin.iOS を効果的に使うにはしっかり仕組みを理解することが必要となります。しっかりと理解して利用すればトラブルは発生しませんが、完全に使いこなすにはかなり深いところまでを理解する必要があるため、これまで Xamarin.iOS を使ってきた総仕上げとして知る限りのことを記録できればと考えています。

Xamarin.iOS の優れている点

iOSOEM Widgets や API をすべて利用でき、しかも .NET の機能も織り交ぜながら、機能拡張できます。


iOSOEM Widgets の機能を .NET の機能も織り交ぜながら、拡張できるのはとても強力です。できることの幅がとても広がります。難易度は別として Xamarin.iOS に起因して何かができなくなることはまずありません。ちょっとした便利機能を追加するのも簡単ですし、各種 MVVM のライブラリや Rx のライブラリ等自分の好みの機能を追加して利用することができます。また、View Model や Model と上手く連携することで、Xamarin の本領である Android との共通化にも大きく寄与します。

プロトコルセレクター など、Objective-C ランタイムのコアな機能を使うことができます。


プロトコルセレクターに相当する機能は .NET 側にもありますが、アプリを開発していくと敢えて、iOS 側の機能を使いたくなるケースがあります。
そのような時、Xamarin.iOS では自分でプロトコルを定義できるので、iOS 側に寄せる部分、.NET 側に寄せる部分を整理することで構成をスッキリさせることができます。iOS の機能を使うか、.NET の機能を使うか、その選択を自分で選べるのは大きな利点です。

Xamarin.iOS の使いにくい点

自由度が高いため、よく理解していないで使うと、かえって負債を産んでしまいます。

ネイティブでできることはほぼ全部できるのと同時に、そこに .NET も混ぜることができるので、非常に複雑化しやすくなります。しっかり考えて使わないとグチャグチャな構造になり、手が付けられなくなります。

使い方を間違えるとメモリーリークやイベントの破壊などが起きる仕様を抱えています。

これは相互運用を行わず、Objective-C ランタイムの中の閉じた世界とすれば、このような問題も起こりませんでした。

まとめ

Xamarin.iOS は効果も問題点もすべてを理解して使わないとその実力を発揮できません。

苦労も多いですが、C# ユーザーが、iOS のアプリを書きたいときに知らない言語、知らない OS、知らない API で始めるのがつらい場合、チャレンジする価値は十分にあります。なぜなら、.NET が簡単すぎるだけで、Xamarin.iOS でおこるメモリーリークなどのトラブルは色々なプログラム言語を習得していけば普通に遭遇する事象であり、特別なものではありません。よって、それをこの機会にしっかり理解しておけば他の言語などを理解するときにとても役に立つからです。


今回は以上となります。


次回はこちらです。
hiro128.hatenablog.jp