Xamarin. iOS içindeki yeni başvuru sayma sistemi

Xamarin. iOS 9.2.1, gelişmiş başvuru sayma sistemini varsayılan olarak tüm uygulamalara sunmuştur. Bu, Xamarin. iOS 'ın önceki sürümlerinde izlenmesi ve düzeltilmesi zor olan çok sayıda bellek sorununu ortadan kaldırmak için kullanılabilir.

Yeni başvuru sayma sistemi etkinleştiriliyor

Xamarin 9.2.1 itibariyle yeni başvuru sayma sistemi varsayılan olarak Tüm uygulamalar için etkinleştirilmiştir.

Var olan bir uygulama geliştiriyorsanız, tüm tekrarlarının aşağıdaki gibi ayarlandığından emin olmak için. csproj dosyasını kontrol edebilirsiniz MtouchUseRefCountingtrue :

<MtouchUseRefCounting>true</MtouchUseRefCounting>

Uygulamanız için ayarlandıysa, false Yeni araç kullanımı kullanılmaz.

Xamarin 'in eski sürümlerini kullanma

Xamarin. iOS 7.2.1 ve üzeri, yeni başvuru sayma sistemimizin gelişmiş bir önizlemesini sunar.

Classic API:

Bu yeni başvuru sayma sistemini etkinleştirmek için, aşağıda gösterildiği gibi projenizin IOS derleme seçeneklerininGelişmiş sekmesinde bulunan başvuru sayımı uzantısını kullan onay kutusunu işaretleyin:

Yeni başvuru sayma sistemini etkinleştir

bu seçeneklerin Mac için Visual Studio daha yeni sürümlerinde kaldırıldığını unutmayın.

Unified API:

Yeni başvuru sayım uzantısı Unified API için gereklidir ve varsayılan olarak etkinleştirilmelidir. IDE 'nizin daha eski sürümlerinde bu değer otomatik olarak denetlenmeyebilir ve kendinize bir denetim yerleştirmeniz gerekebilir.

Önemli

Bu özelliğin daha önceki bir sürümü, MonoTouch 5,2 ' den beri oluşturulmuştur ancak yalnızca bir deneysel önizleme olarak SGen için kullanılabilir. Bu yeni, geliştirilmiş sürüm artık Boehı atık toplayıcısı için de kullanılabilir.

Tarihsel olarak, Xamarin. iOS tarafından yönetilen iki tür nesne vardır: yalnızca yerel nesne (eş nesneler) etrafında bir sarmalayıcı olan ve yeni işlevleri (türetilmiş nesneler) genişletmiş veya dahil etenler (genellikle daha fazla bellek içi durumu tutarak). Daha önce, (örneğin, bir C# olay işleyicisi ekleyerek) bir eşdüzey nesneyi geliştirmemiz mümkün, ancak nesnenin başvurulmayan ve sonra toplanmasına izin veririz. Bu, daha sonra kilitlenmesine neden olabilir (örn. Objective-C çalışma zamanı yönetilen nesneye geri çağrılırsa).

Yeni sistem, ek bilgi depolarsa, eş nesneleri çalışma zamanı tarafından yönetilen nesnelere otomatik olarak yükseltir.

Bu, bu gibi durumlarda gerçekleşen çeşitli kilitlenmeleri çözer:

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;
   }
}

Başvuru sayısı uzantısı olmadan bu kod cell kilitlenir, çünkü toplanabilir TouchDown bir işaretçiye çevrilecek olan temsilcisi.

Başvuru sayısı uzantısı, yönetilen nesnenin canlı kalmasını sağlar ve yerel nesne yerel kodla korunacağından koleksiyonunu önler.

Yeni sistem aynı zamanda bağlamalarda kullanılan çoğu özel yedekleme gereksinimini ortadan kaldırır. Örneğin, örneği canlı tutmaya yönelik varsayılan yaklaşımdır. Yönetilen bağlayıcı, yeni başvuru sayısı uzantısını kullanarak tüm gereksiz alanları uygulamalardan kaldırmak için yeterince akıllı bir değer.

Bu, yönetilen her nesne örneklerinin daha az bellek tükettiği anlamına gelir. Ayrıca, bazı yedekleme alanları çalışma zamanının artık gerek duyulmayan başvuruları tutacağından ilgili bir sorunu çözer Objective-C ve bu da bazı belleğin geri kazanımı zorlaştırır.