関する事を中心に書いています。本ブログと所属組織の公式見解は関係ございません。Blazorはじめにこんにちは、@hiro128_777です。と3種類も登場しています。クロスプラットフォームやるぞ」という方は、いったいどれから始めればいいのか迷ってしまうと思いますので、それぞれ、どんな違いがあるのかを簡単に整理してみました。問題なくアプリ開発ができます。らしさについて細かい調整ができます。こだわりがないツール的なアプリが本当に簡単に作成できます。書けるという感じです。実際にサンプルアプリをビルドしてみるとその違いがよくわかりますので、ぜひ試してみてください。アプリのビルド時にエラーを吐いてビルドできない問題がありました。初回起動時にダイアログが出て、インストールを確認する仕様になっているためです。使うときの大きなハマりどころでした。教えてくれて、そのままインストールも可能なようになっていました。インストールしていないと、下記のように教えてくれます。初回起動時のインストールが始まります。本気で取り組んでくれています。使っていない方は使ってみてください。オブジェクトが破棄される状況を理解するXamarinはじめにこんにちは、@hiro128_777です。仕組みについてお話させていただきました。詳しく説明していこうと思います。前回のお話はこちらです。挙動について深く見ていきます。判断で自由に開放することはできないというお話をしました。オブジェクトはいつ解放されるのでしょうか。解放される状況は実質以下の2つです。そのオブジェクトを回収できるようになります。対応するマネージオブジェクトが存在しないことを検出し、それを再作成しようとします。これは失敗し、プロセスを終了させる例外がスローされてしまいます。以下のような挙動をします。マネージオブジェクトの参照を外す。(まだGCに回収はされていない)ただし、ネイティブオブジェクトの参照カウンタが0に達するまで、ネイティブオブジェクトとマネージオブジェクトの間のリンクは切断しない。button?.Dispose();}上記のような場合、button?.RemoveFromSuperview()が実行されると、ネイティブオブジェクトの参照カウンタが1になります。マネージオブジェクトからの参照が唯一の参照であり、ネイティブコードは当該オブジェクトを再び使用しないと安全に仮定できます。マネージオブジェクトを回収できるようになります。オブジェクトは破棄されます。今回は以上となります。次回は、イベントのアタッチによってメモリーリークするメカニズムを手順を追ってご説明します。Platformはじめにこんにちは、@hiro128_777です。2019」の22日目になります。利用していると言うことですので、気になっているのでちょっと触ってみました。アプリとどう違うかを調べてみました。調べるにはとにかく実機ビルドしなければいけませんので、超簡単なサンプルを作って早速ビルドしてみました。作ってビルドしました。ついてはレジストラーを使えるようにするための仕組みですのでこちらの公式ドキュメントも是非ご参照ください。方がだいぶ少ないですね。利用できるように、かなりの量のコードを書いています。この部分が丸々乗っかって来てるので、起動時に必要なアセンブリが多くなっています。ランタイム側から引数をマーシャリングして呼ぶ仕組みです。詳しくはこちらをご覧ください。こちらの公式ドキュメントも参考になります。トランポリンの分布は調べるのがかなりしんどいので調べていません。ランタイムに登録する仕組みです。利用できるように、かなりコードを書いていることに起因しています。8.7MB上記のようになりました。方がアセンブリの数が多いので、順当な結果です。実際に大きいアプリになればフレームワークの容量はあまり関係ないので、そこまで気にするほどではないと思います。利用しているので、その観点からは大きな差はないことがわかりました。コンポーネントのライブラリが違うだけと言うそのままの結果でした。一緒に生成したいかでどちらを使うか決めればよいと思います。コンポーネントの定義とレンダリングが分離されていません。ように比較的戦略的に機能を追加するのは難しく、あまり自分でカスタマイズして使う前提ではないのかも知れません。様々なプラットフォーム上に展開するのがゴールだとあるので、カスタマイズは方向性として違うのだと思います。使っていても、そもそもの思想が違うようです。プラットフォームのブリッジとして、とてもよくできているからだと思っています。上に乗せる形になっているのも、とても素晴らしい設計です。方向性が違うので今後の発展がとても楽しみです。時間をとって、もっと色々調べてみたいです。こちらなのでよろしければご覧くださいませ。PlatformXamarin.Forms以上です。typeXamarinはじめにこんにちは、@hiro128_777です。仕組みについてお話させていただきました。詳しく説明していこうと思います。前回のお話はこちらです。hiro128.hatenablog.jp前回は、ネイティブとマネージドの話でした。ネイティブオブジェクトにはさらに2種類のオブジェクトがあります。今回はその説明となります。いう2つの型があります。挙動を考える上で、この2つの型の区別はとても重要になります。型をラップした型です。メモリーリークはしません。特徴マネージドの世界では、ネイティブオブジェクトのインスタンスへのハンドルだけのみを持ちます。インスタンスの寿命は、ネイティブオブジェクトの寿命とは無関係です。判断によっていつでも自由に解放できます。インスタンスが再度作成されるます。アップグレードされます。対応する型が無いものです。いつマネージ側の参照が解放され。ネイティブオブジェクトが破棄されるかがポイントです。特徴マネージドの世界では、ネイティブオブジェクトのインスタンスへのハンドルの他に、マネージドな世界だけで管理されているステートを持ちます。インスタンスの寿命は、ネイティブオブジェクトの寿命と関連があります。判断によって自由に解放することはできません。作成し、回収されないようにします。今回は以上となります。ネイティブとマネージドXamarinはじめにこんにちは、@hiro128_777です。仕組みについてお話させていただきました。詳しく説明していこうと思います。前回のお話はこちらです。メモリーリークするメカニズムについての説明に入っていきます。アプリのアーキテクチャーについてはこちらの公式ドキュメントも是非ご参照ください。メモリリークやイベントの消失など「クセ」があり大変なのは、プラットフォーム固有の部分だけです。世界で閉じていることの多いロジック部分は、センサー類などの機種依存コードのDI部分を除けばとても安定しています。プラットフォーム固有の部分とは、具体的には以下の2つです。世界へのポインター(ハンドル)を持っていることです。ネイティブの世界へのハンドルを持っているため適切に扱わないとからリークします。世界へのポインターを持つものを適切に扱わないとリークしてしまうのと同じことです。}}ネイティブとマネージドネイティブとマネージドの定義は以下の通りとなります。Objective-C(ネイティブ)の世界がある事を常に意識してください。この表と裏の世界との関係性によって、メモリーリークが発生します。それでは、今回は以上となります。簡単にメモリーリークしてしまうXamarinはじめにこんにちは、@hiro128_777です。仕組みについてお話させていただきました。この話題を掘り下げて説明していこうと思います。前回のお話はこちらです。ハマりがちなメモリーリークについてご説明します。簡単なサンプルコードでメモリーリークの状況をそれぞれ確認する。閉じるサンプルコードです。同じことをしています。アップしてありますので是非動かしてみてください。アップしたサンプルではオブジェクトの初期化、破棄、ファイナライズでそれぞれトレースを出力するようにしています。コードは簡略化してあります。Close();フルバージョンはこちらです。github.comとても簡単なコードですね。メモリーリークなどしません。null);フルバージョンはこちらです。メモリーリークしてしまいます。すごいと言った方が正確です。「禁断の果実」に手を出しているからメモリーリークしてしまいます。ランタイムのコアな機能を使うことができるという機能を使えるようにした「副作用」です。メモリーリークする詳しいメカニズムを見ていきましょう。今回は以上となります。