Sistem Penghitungan Referensi Baru di Xamarin.iOS

Xamarin.iOS 9.2.1 memperkenalkan sistem penghitungan referensi yang ditingkatkan ke semua aplikasi secara default. Ini dapat digunakan untuk menghilangkan banyak masalah memori yang sulit dilacak dan diperbaiki di versi Xamarin.iOS sebelumnya.

Mengaktifkan Sistem Penghitungan Referensi Baru

Pada Xamarin 9.2.1, sistem penghitungan ref baru diaktifkan ke semua aplikasi secara default.

Jika Anda mengembangkan aplikasi yang ada, Anda dapat memeriksa file .csproj untuk memastikan bahwa semua kemunculan MtouchUseRefCounting diatur ke true, seperti di bawah ini:

<MtouchUseRefCounting>true</MtouchUseRefCounting>

Jika diatur ke false aplikasi Anda tidak akan menggunakan alat baru.

Menggunakan versi Xamarin yang lebih lama

Xamarin.iOS 7.2.1 ke atas memiliki pratinjau yang ditingkatkan dari sistem penghitungan referensi baru kami.

API Klasik:

Untuk mengaktifkan Sistem Penghitungan Referensi baru ini, centang kotak Gunakan ekstensi penghitungan referensi yang ditemukan di tab Tingkat Lanjut dari opsi Build iOS proyek Anda, seperti yang ditunjukkan di bawah ini:

Enable the new Reference Counting System

Perhatikan bahwa opsi ini telah dihapus di versi Visual Studio untuk Mac yang lebih baru.

API Terpadu:

Ekstensi penghitungan referensi baru diperlukan untuk API Terpadu dan harus diaktifkan secara default. Versi LAMA IDE Anda mungkin tidak memiliki nilai ini diperiksa secara otomatis dan Anda mungkin harus melakukan pemeriksaan sendiri.

Penting

Versi sebelumnya dari fitur ini telah ada sejak MonoTouch 5.2 tetapi hanya tersedia untuk sgen sebagai pratinjau eksperimental. Versi baru yang ditingkatkan ini sekarang juga tersedia untuk pengumpul sampah Boehm .

Secara historis ada dua jenis objek yang dikelola oleh Xamarin.iOS: yang hanya pembungkus di sekitar objek asli (objek serekan) dan yang memperluas atau menggabungkan fungsionalitas baru (objek turunan) - biasanya dengan menjaga status ekstra dalam memori. Sebelumnya ada kemungkinan bahwa kita dapat menambah objek serekan dengan status (misalnya dengan menambahkan penanganan aktivitas C#) tetapi bahwa kita membiarkan objek tidak direferensikan dan kemudian dikumpulkan. Ini dapat menyebabkan crash di kemudian hari (misalnya jika runtime dipanggil Objective-C kembali ke objek terkelola).

Sistem baru secara otomatis meningkatkan objek peer ke dalam objek yang dikelola oleh runtime ketika mereka menyimpan informasi tambahan.

Ini memecahkan berbagai crash yang terjadi dalam situasi seperti ini:

class MyTableSource : UITableViewSource {
   public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath) {
        var cell = tableView.DequeueReusableCell ("myId");
        if (cell != null)
                return cell;

        cell = new UITableViewCell (UITableViewCellStyle.Default, "myId");
        var txt = new UITextField ();
        txt.TouchDown += delegate { Console.WriteLine ("...."); };
        cell.ContentView.AddSubview (txt);
        return cell;
   }
}

Tanpa ekstensi jumlah referensi, kode ini akan crash karena cell menjadi dapat dikumpulkan, sehingga delegasinya TouchDown , yang akan diterjemahkan ke dalam pointer yang menggantung.

Ekstensi jumlah referensi memastikan objek terkelola tetap hidup dan mencegah pengumpulannya, asalkan objek asli dipertahankan oleh kode asli.

Sistem baru juga menghapus kebutuhan sebagian besar bidang dukungan privat yang digunakan dalam pengikatan - yang merupakan pendekatan default untuk menjaga instans tetap hidup. Linker terkelola cukup cerdas untuk menghapus semua bidang yang tidak diperlukan dari aplikasi menggunakan ekstensi jumlah referensi baru.

Ini berarti bahwa setiap instans objek terkelola menggunakan lebih sedikit memori daripada sebelumnya. Ini juga memecahkan masalah terkait di mana beberapa bidang dukungan akan menyimpan referensi yang tidak diperlukan lagi oleh Objective-C runtime, sehingga sulit untuk merebut kembali beberapa memori.