ããã¯ã Samuel Debruynã«ããèšäºã®ç¿»èš³ã§ãã ç§ã¯ãã®èšäºããšãŠãæ°ã«å ¥ã£ãã®ã§ãhabrã³ãã¥ããã£ãšå ±æããããšããèªçºçãªæ¬²æ±ããããŸãã:)
Xamarinã¯ã.NETéçºè ãAndroidãiOSãmacOSåãã®ã¢ããªã±ãŒã·ã§ã³ã.... ãããããã®é©ãã¹ãæ©èœã«ã¯äŸ¡æ ŒããããæãåçŽãªã¢ããªã±ãŒã·ã§ã³ã§ãã倧éã®ã¡ã¢ãªãç°¡åã«æ¶è²»ããå¯èœæ§ããããŸãã ãããã©ã®ããã«èµ·ãããããã§äœãã§ããããèŠãŠã¿ãŸãããã ç§ã®äŸã®ã»ãšãã©ã¯Xamarin.Androidã«åºã¥ããŠããŸãããããã¯Xamarin.iOSã«ãåœãŠã¯ãŸãããšãããã«ããããŸãã
Xamarinã¢ããªã±ãŒã·ã§ã³ã§ã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®åäœ
å®éãXamarinã¢ããªã±ãŒã·ã§ã³ã¯ããã€ãã®ã¿ã€ãã®ãªããžã§ã¯ãã䜿çšããŸãã åXamarinã¢ããªã±ãŒã·ã§ã³ã«ã¯ã2ã€ã®ç°ãªãäžçã«ååšãããªããžã§ã¯ãããããŸãã
-
System.Object
ããç¶æ¿ããããªããžã§ã¯ããå«ãã管çãããMonoã®äžç -
NSObject
ïŒiOSïŒãŸãã¯Java.Lang.Object
ïŒAndroidïŒããç¶æ¿ãããªããžã§ã¯ããå«ãã管çãããŠããªããã€ãã£ãã¯ãŒã«ã
ãŸãã2ã€ã®ã¬ããŒãžã³ã¬ã¯ã¿ãååšããæ©èœããããšã«ããªããŸãã
- SGENãšåŒã°ããMonoã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒ
- ãã€ãã£ãã®AndroidãŸãã¯iOSã®äžçã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒ
æåã«SGENãèŠãŠã¿ãŸãããã å®éã Xamarin Universityã«ã¯ãã®ãããã¯ã«é¢ããéåžžã«èå³æ·±ãè¬çŸ©ãããã€ããããŸãããå ¬åŒããã¥ã¡ã³ãã§ã¯ããã«ã€ããŠéåžžã«ãã説æãããŠããŸãã
SGENã®ä»çµã¿ã«ã€ããŠã¯è©³ãã説æããŸããã ãã®ãããã¯ã¯æ¬¡ã®æçš¿ã«æ®ããŸãã ããã§ç¥ãå¿
èŠãããã®ã¯ã GC.Collect()
ã³ãã³ãã§å®å
šãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãåŒã³åºãã CG.Collect(0)
ã³ãã³ãã§ãŒãäžä»£ãªããžã§ã¯ãïŒææ°ïŒã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãCG.Collect(0)
ã§ãã ä»ã®ã³ãã³ãã®ã»ãšãã©ã¯ãå·çæç¹ã§ã¯Monoã«å®è£
ãããŠããŸããã ãŸãã¯ãXamarin Profilerã®ã¹ãããã·ã§ããæ©èœã䜿çšããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãé«éåã§ããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®çµäºSGENã¯ãå¥ã®ãã€ãã£ãã¯ãŒã«ãã§ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãèµ·åããŸãã
ãã¢ãªããžã§ã¯ã
Xamarinã§2çš®é¡ã®ãªããžã§ã¯ãã«èšåããŸãããïŒ ã¯ãããããã ãªããžã§ã¯ãã¯ãã¹ãŠ2ã€ã®äžçã«ååšããŸãããå®éã«ã¯3çªç®ã®ã¿ã€ãã®ãªããžã§ã¯ãã䜿çšããŸãã
- 管ç察象ãªããžã§ã¯ãïŒã¢ãã®äžçïŒ
- 管çãããŠããªããªããžã§ã¯ãïŒãã€ãã£ãã¯ãŒã«ãïŒ
- ãã¢ãªããžã§ã¯ãïŒã¢ãã¯ãŒã«ãããããŒãžãã¯ãŒã«ããšã¢ã³ãããŒãžãã¯ãŒã«ãéã®ããªããžãªããžã§ã¯ãïŒ
ããã«ããã¢ãªããžã§ã¯ãã2ã€ã®ã«ããŽãªã«åé¡ã§ããŸãã
- ãã¬ãŒã ã¯ãŒã¯ãã¢ïŒXamarin.AndroidãŸãã¯Xamarin.iOS SDKã®äžéšã§ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹
- ãŠãŒã¶ãŒãã¢ïŒèªåã§äœæãããã€ãã£ããªããžã§ã¯ãããç¶æ¿ããã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹
ãããã£ãŠãXamarinéçºè ãšããŠã管ç察象ãªããžã§ã¯ããŸãã¯ãŠãŒã¶ãŒãã¢ãäœæããæš©å©ããããŸãã
ããã€ãã®äŸïŒ
- ãã¬ãŒã ã¯ãŒã¯ãã¢ ïŒ android.content.ContextãUIViewController ...
- ãŠãŒã¶ãŒãã¢ïŒ MyCustomActivityãMyCustomViewHolderãMyCustomViewController ...
ãããã®éãã¯äœã§ããïŒ ãããAndroidåŽïŒiOSã®å Žåãåæ§ïŒããèŠãŠã¿ãŸãããã
ãã¬ãŒã ã¯ãŒã¯ãã¢ã¯ãå€ãã®å ŽåãManaged Callable WrapperïŒMCWïŒãšåŒã°ããŸãã ãã®ååãã次ã®ããšãããããŸãã
- Managed CallableïŒãªããžã§ã¯ããååšããMonoã®äžçããåŒã³åºãããŸã
- ã©ãããŒïŒããã¯ãMonoãªããžã§ã¯ãå ã®ãã€ãã£ãAndroidãªããžã§ã¯ãã®ã©ãããŒã§ã
Xamarin / Visual Studioã§Androidãã€ã³ãã£ã³ã°ãããžã§ã¯ããäœæããŠããå Žåã¯ãMCWãäœæããããšãç¥ã£ãŠããå¿ èŠããããŸãã å éšã§ã¯ãXamarinã¯Androidã®äžçãããã€ãã£ãã¡ãœãããåŒã³åºãã³ãŒããçæããŸãã ãããå®çŸããããã«ãJNIïŒJava Native InterfaceïŒã䜿çšããŸãã Androidã®äžçã«ååšãããããŸã Xamarinã§ã©ããããŠããªãã¡ãœãããåŒã³åºãããå Žåã¯ãJNIã䜿ââçšããŠãã®ã¡ââãœãããåŒã³åºãããšãã§ããŸãã
ãŠãŒã¶ãŒãã¢ã¯ãAndroid Callable WrapperïŒACWïŒãšåŒã°ããããšããããããŸãã 次ã«ããã®ååãã次ã®ããšãããããŸãã
- AndroidåŒã³åºãå¯èœïŒãªããžã§ã¯ããååšããAndroidã®äžçããåŒã³åºãããŸã
- ã©ãããŒïŒããã¯ãMonoã®äžçãããã€ãã£ãã¡ãœãããåŒã³åºãããšãã§ããã©ãããŒã«éããŸãã
ãããã£ãŠãå®éã«ã¯ãåãã¢ãªããžã§ã¯ãã¯ãå®éã«ã¯ã¡ã¢ãªå ã«ååšãã2ã€ã®ãªããžã§ã¯ãã§æ§æãããŠãããšèšããŸããå®éã®ãªããžã§ã¯ãïŒãã€ãã£ããŸãã¯ã¢ãïŒãšã©ãããŒãªããžã§ã¯ãã§ãã
ãã®æ§é ã«ãããXamarinã¯ãŸã£ããç°ãªããã©ãããã©ãŒã ã§å®è¡ã§ããŸãããããXamarinãéåžžã«åªããŠããçç±ã§ãã ããããã¹ãŠã«ãããXamarinéçºè ã¯éåžžã«ç°¡åã«ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããããããã©ã®ããã«æ©èœããããç解ããŠããªãããšããXamarinã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªåé¡ã®åå ã«ãªãããšããããããŸãã
泚æïŒ å€å žçãªããããããã®äŸ
Xamarinã¢ããªã±ãŒã·ã§ã³ã§æãäžè¬çãªã倧ããªããªããžã§ã¯ãã¯ãããããããïŒç»åïŒã§ãã ã»ãšãã©ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãããé åçã«èŠããããã«ãå°ãªããšãããã€ãã®åçãå«ãŸããŠããŸãã ããããããã«ã¯äŸ¡æ ŒããããŸãããããã®åçã¯ãã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªå ã§æ倧ã®ãªããžã§ã¯ãã§ãã
ãã ããAndroidã«ãããããããããŠã³ããŒãããããŠãŒã¶ãŒã«ãšã£ãŠéœåã®è¯ãæ¹æ³ã§ã¡ã¢ãªå ã®ééã確èªãããšãã»ãšãã©ã®å Žåããµã€ãºãç¡èŠã§ããããšã«æ°ä»ãã§ãããã 5 MBã®ç»åã§ãæ°ãã€ããå æããŸãã
ããã¯ã©ã®ããã«å¯èœã§ããïŒ 5 MBã¯ã©ãã«è¡ããŸãããïŒ Monoã®äžçã§ã¯ããã®å³ã¯ãã€ãã£ããªããžã§ã¯ãã®ã©ãããŒã«ãããŸããã ãã®ãã€ãã£ããªããžã§ã¯ãã¯ãã¡ã¢ãªã§5 MBãå æããŸãã
ããŠãèšã£ãŠã¿ãŸãããããããããã¯ã©ã®ããã«åé¡ã®åå ã«ãªãåŸãããã¯æçš¿ã®ãããã¯ã«ã©ã®ããã«é¢ä¿ããŸããïŒ ä»¥äžã®ã¢ã¯ãã£ããã£ã³ãŒããèŠãŠã¿ãŸãããã
[Activity(Label = "App1", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); for (int i = 0; i < 100; i++) { var hugeBitmap = Android.Graphics.BitmapFactory.DecodeFile($"path/to/bitmaps/{i}.png"); if(!ImageContainsUnicorn(hugeBitmap)) { continue; } var imageView = FindViewById<ImageView>(Resource.Id.SomeImageView); imageView.SetImageBitmap(hugeBitmap); } } }
ãã®ã³ãŒãã¯100åã®ãããããããããŒãããç»åã«ãŠãã³ãŒã³ãå«ãŸããŠãããã©ããã確èªããå«ãŸããŠããå Žåã¯ImageViewã«è¡šç€ºããŸãã å²ãåœãŠããããããããããã¹ã³ãŒãããå€ãããšããã«ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠåéããããããæåŸã«1ã€ã®ããããããã®ã¿ã䜿çšãããããã¡ã¢ãªã®åé¡ã¯ãããŸããã
ééã£ãã OutOfMemoryException
åå ã§ãã¢ããªã±ãŒã·ã§ã³ã¯æ°ããªç§ã§OutOfMemoryException
ããŸãã ãããèµ·ããçç±ãç解ããããã«ããã®ç¶æ³ã§Xamarinãã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
hugeBitmapå€æ°ã¯MCWã§ãããMonoã§ã®ãã®ãªããžã§ã¯ãã®ãµã€ãºã¯å°ãããªããŸãã äžèšã®ã³ãŒãã¯äžè¬ã«ïŒMonoã®äžçã§ïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãéå§ãã¹ãã§ã¯ãããŸããã
äžæ¹ãã¢ã³ããã€ãã¯ã¯ã¬ã€ãžãŒã«ãªããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ã¯ã¬ã€ãžãŒãªããŒã¹ã§å®è¡ãããŸãã ãã ããçµã¿ç«ãŠããããªããžã§ã¯ããèŠã€ããããšã¯ã§ããŸããã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãããããããåéã§ããŸãããããããããã¯ãããŒãžãïŒã¢ãïŒã¯ãŒã«ãã®ã©ãããŒãªããžã§ã¯ããåç
§ããããã§ãã ãããŒãžã©ãããŒãSGENã«ãã£ãŠåéããããŸã§ããã€ãã£ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯äœãã§ããŸããã ãã®çµæããã€ãã£ãã®äžçã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯OutOfMemoryException
ããã£ããããŸãã
äœãã§ããŸããïŒ
åãã¢ãªããžã§ã¯ãã¯IDisposableã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããŸãã ãããã©ã®ããã«å®è£ ãããŠããããç°¡åã«èŠãŠã¿ãŸãããã
Xamarin.Androidã®äžèšã®å®è£ ã¯ãJava.Interopã®äœ¿çšã«åãæ¿ãããããææ°ããŒãžã§ã³ã§ã¯äœ¿çšãããªããªã£ãããšã«æ³šæããŠãã ããã ããã®å®è£ èªäœã¯å®å šã«ç°ãªããŸãããäœæ¥æ¹æ³ã¯å€ãæ¹æ³ãšéåžžã«äŒŒãŠããŸãã
ã芧ã®ãšããã Dispose()
ã®åŒã³åºãã¯ãã©ãããŒãšã©ãããããïŒãã€ãã£ãïŒãªããžã§ã¯ãã®éã®ããªããžãDispose()
ãŸãã ããã«ããããªã³ã¯ãåé€ãããŸããã©ãããŒãªããžã§ã¯ããç Žæ£ããåŸããã¡ããããã®ãªããžã§ã¯ãã«ãã€ãã£ãã¯ãŒã«ãã«ãªã³ã¯ããªãå Žåããã€ãã£ããªããžã§ã¯ãã¯ã¬ããŒãžã³ã¬ã¯ã¿ã«ãã£ãŠåéã§ããŸãã
ãããïŒ ã ããç§ã¯åžžã«ãã¹ãŠã®ãªããžã§ã¯ãã§Dispose()
ãåŒã³åºãå¿ èŠããããŸããïŒ
ã»ãšãã©ããããå®å
šã§ã¯ãããŸããã å®éãusingæ§æã䜿çšããŠäžèšã®ã³ãŒããæ¹åã§ããŸãã ç¥ã£ãŠããããã«ãusingã¯usingãããã¯ã®çµäºåŸãããã«Dispose()
åŒã³åºããŸãã 99ïŒ
ã®å Žåãå¿
èŠãªã¡ãœãã/ããããã£ãåŒã³åºããçŽåŸã«ãã¬ãŒã ã¯ãŒã¯ãã¢ãç Žæ£ããã®ã¯å®å
šã«æ£åžžã§ãã ãã€ãã£ããªããžã§ã¯ãã¯ãå¿
èŠãªéãåç¶ãããã®ãªããžã§ã¯ããžã®åç
§ä»¥å€ã¯äœãå£ããŸããã
äžèšã®ã³ãŒãã®æ¹è¯çã¯æ¬¡ã®ããã«ãªããŸãã
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); for (int i = 0; i < 1000; i++) { using(var hugeBitmap = Android.Graphics.BitmapFactory.DecodeFile($"path/to/bitmaps/{i}.png")) { if (!ImageContainsUnicorn(hugeBitmap)) { continue; } using(var imageView = FindViewById<ImageView>(Resource.Id.SomeImageView)) { imageView.SetImageBitmap(hugeBitmap); } } } }
ãã ãã OnResume()
ãªã©ã®å¥ã®ã¡ãœããã§ImageViewã䜿çšããå¿
èŠãããå ŽåãImageViewãOnResume()
ããã®ã«æé©ãªå ŽæDispose()
ãã¢ã¯ãã£ããã£èªäœã®OnDestroy()
ãŸãã¯Dispose()
ã FindViewById()
ãå¿
èŠãªåæ°ã ãåŒã³åºãããšãã§ãããšäž»åŒµããŠèšãããšãã§ããŸãããããã¯éåžžã«é«äŸ¡ãªæäœã§ãããé¿ããã¹ãã§ãã éåžžããã®ã¡ãœããã¯ãªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã®æåŸã«äœ¿çšãããã Dispose()
ã¡ãœããããªãŒããŒã©ã€ãããŸãã ããã¯å¿
èŠãªããšã§ã¯ãããŸããããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäœ¿çšéãæžããã®ã«åœ¹ç«ã¡ãŸãã
ã€ãã³ãã«é¢ããå°ããªã¡ã¢
ãããããäžèšã®ãã¹ãŠãã€ãã³ãã«é©çšãããããšãæ¢ã«æšæž¬ããŠããã§ãããã ã¢ã¯ãã£ããã£ã®æåŸã®ã©ã€ããµã€ã¯ã«ã¡ãœãããView Controllerãªã©ã§ã€ãã³ãã®ç»é²ã解é€ããããšãå¿ããªãã§ãã ããã ãŸãã¯ãSGENã¯ãªããžã§ã¯ããåéããŸããã ãªããžã§ã¯ãã«ãã¢ãªããžã§ã¯ããžã®åç §ãããå Žåããããã®ãã¢ãªããžã§ã¯ãã¯æ°žä¹ ã«åç¶ããŸãã
ãŠãŒã¶ãŒãã¢ãªããžã§ã¯ãã§DisposeïŒïŒãåŒã³åºããªãããã«ããçç±
æéãæ¥ãããXamarinã¯ãŠãŒã¶ãŒãã¢ãªããžã§ã¯ãã«å¯ŸããŠDispose()
ãåŒã³åºããŸãã ããããã¢ããªã±ãŒã·ã§ã³éçºè
ã«ãšã£ãŠããã®ææããã€æ¥ãã¹ãããç解ããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã äžè¬ã«ãããã¥ã¡ã³ãã«ã¯ããŠãŒã¶ãŒãã¢ãªããžã§ã¯ãã«å¯ŸããŠDispose()
æåã§åŒã³åºããªãã§ãã ããã ãªããžã§ã¯ããåç
§ããŠãããã®ãäœããªãããšã確èªããŠãã ãããããããã°ããã¬ãŒã ã¯ãŒã¯ãäœæ¥ãè¡ããŸãã
IntPtrããã³JNIHandleOwnershipãæã€ã³ã³ã¹ãã©ã¯ã¿ãŒ
Dispose()
ãŠãŒã¶ãŒãã¢ãªããžã§ã¯ããæåã§åŒã³åºããAndroid OSããã®ãªããžã§ã¯ããå¿
èŠãšããå ŽåãMonoã¯ä»¥äžã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸãã
public MyClass(IntPtr javaRef, JniHandleOwnership transfer) : base(javaRef, transfer) { }
åæ§ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãJNIHandleOwnershipãªãã®Xamarin.iOSã®ã¿ã«ãããŸãã ãã®å ŽåãMonoã¯æ¶ãããªããžã§ã¯ããåäœæããããšããŸãã
ãã®ãããªã³ã³ã¹ãã©ã¯ã¿ãŒãå®è£
ãããŠããªãå Žåãã¢ããªã±ãŒã·ã§ã³ã¯NotSupportedException
å³åº§ã«NotSupportedException
ããŸãã Googleããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ãå€æŽããããšã決å®ãããã®ãµã€ã¯ã«ã®æåŸãŸã§Dispose()
ãåŒã³åºããšãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã
WeakReferenceãã©ã®ããã«åœ¹ç«ã€ã
ãã€ãã£ããªããžã§ã¯ããžã®ãªã³ã¯ãé 眮ããªãããã«ãéåžžã®ïŒåŒ·åãªïŒãªã³ã¯ã®ä»£ããã«WeakReferenceã䜿çšããŸãã ããã¯ããããã®ãªããžã§ã¯ããæ€çŽ¢ããéã®ããã©ãŒãã³ã¹ã«å°ãã³ã¹ããããããŸããããã€ãã£ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ãã€ã§ããããã®ãªããžã§ã¯ããåéã§ããŸãã ãããã£ãŠããªã³ã¯ã®ã¿ã€ããæ éã«éžæããŠãã ããïŒ ããã«æ¶ããããšã®ã§ããªãããããããã¯ã匱ããªã³ã¯ã®è¯ãåè£ã«ãªãå¯èœæ§ããããŸãããUILabelã®ãããªå°ããªãªããžã§ã¯ãã®å Žåãããã¯å®éã«ã¯éèŠã§ã¯ãããŸããã
Xamarin.Formsã¯ã©ãã§ããïŒ
Xamarin.Formsã®åèŠçŽ ã«ã¯ãã¢ãã€ã«ãã©ãããã©ãŒã äžã§ç¬èªã®ã¬ã³ããªã³ã°ããããã«ã¹ã¿ã ãŸãã¯NuGetããã±ãŒãžã®äžéšãšããŠæäŸãããŸãã ãããã®ã¬ã³ããªã³ã°ã¯ãŠãŒã¶ãŒãã¢ã§ããããã®ããã«èŠãªãããŸãã 以äžã«ãçµã¿èŸŒã¿ã®Androidã¬ã³ããªã³ã°ã§Dispose()
å®è£
ããæ¹æ³ã®äŸã瀺ããŸãã ã¬ã³ããªã³ã°ãå®è£
ããåžžã«å
éšã®ãã€ãã£ããªããžã§ã¯ããç Žæ£ããå Žåã¯ãåæ§ã®ãã¿ãŒã³ã«åºå·ããããšããå§ãããŸãïŒãã¡ãã®ã³ãŒããåç
§ïŒã
AndroidãšiOSããæäŒãããŸã
AndroidãšiOSã«ã¯ãå·®ãè¿«ã£ãã¡ã¢ãªäžè¶³ãéç¥ã§ããã¡ã«ããºã ããããŸãã iOSã§ã¯ãããã¯UIViewControllerã®DidReceiveMemoryWarningïŒïŒã§ã ã Androidã§ã¯ãããã¯ããé ãããŠãããææžåãããŠããŸããïŒ Applicationã®OnTrimMemoryïŒïŒ ã ãããã®ã¡ãœããå
ã§GC.Collect()
ãåŒã³åºãå¿
èŠããããšæ³å®ããã®ã¯è«ççã§ãã ããã«ãããããã€ãã®ãªããžã§ã¯ããã¯ãªã¢ãããããã€ãã®ãã¡ã€ãã©ã€ã¶ãéå§ããã䜿çšãããŠããªããã¢ãªããžã§ã¯ãã§Dispose()
åŒã³åºãããŸãã ããã«ããããã€ãã£ãã¬ããŒãžã³ã¬ã¯ã¿ãŒãæªäœ¿çšã®ãªããžã§ã¯ããã¯ãªãŒã³ã¢ãããããã€ãã£ãåŽã®ç©ºã容éãå¢ããããšãã§ããŸãã
ãããã«
ãã®æçš¿ã¯ãXamarinã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªå¹çãåäžãããããã®ããã€ãã®æçšãªææ¡ãæäŸãããšæããŸããããŸã å€ãã®ããšãäŒããŠãã ããã ããã«ã€ããŠã¯æ¬¡ã®æçš¿ã§èª¬æããŸããããã®éãããã¥ã¡ã³ããèªãã ããGitHubã§Xamarinã®ãœãŒã¹ã³ãŒããåç §ããããXamarinããã€ãã£ããããã¡ã€ã©ãŒãè©ŠããŠã¿ããã§ããŸãã