Xamarin.iOS'ta Yeni Başvuru Sayma Sistemi
Xamarin.iOS 9.2.1, gelişmiş başvuru sayma sistemini varsayılan olarak tüm uygulamalara tanıttı. Xamarin.iOS'un önceki sürümlerinde izlenmesi ve düzeltilmesi zor olan birçok bellek sorununu ortadan kaldırmak için kullanılabilir.
Yeni Başvuru Sayma Sistemini Etkinleştirme
Xamarin 9.2.1 sürümünden itibaren yeni başvuru sayma sistemi varsayılan olarak tüm uygulamalarda etkindir.
Mevcut bir uygulama geliştiriyorsanız, tüm oluşumlarının MtouchUseRefCounting
olarak ayarlandığından true
emin olmak için aşağıdaki gibi .csproj dosyasını de kontrol edebilirsiniz:
<MtouchUseRefCounting>true</MtouchUseRefCounting>
Uygulamanıza ayarlanırsa false
yeni araçları kullanmayacak.
Xamarin'in eski sürümlerini kullanma
Xamarin.iOS 7.2.1 ve üzeri sürümler, yeni başvuru sayma sistemimizin gelişmiş bir önizlemesini sunar.
Klasik API:
Bu yeni Başvuru Sayım Sistemini etkinleştirmek için, aşağıda gösterildiği gibi projenizin iOS Derleme seçeneklerinin Gelişmiş sekmesinde bulunan Başvuru sayım uzantısını kullan onay kutusunu işaretleyin:
Bu seçeneklerin daha yeni Mac için Visual Studio sürümlerinde kaldırıldığını unutmayın.
Yeni başvuru sayım uzantısı Birleşik API için gereklidir ve varsayılan olarak etkinleştirilmelidir. IDE'nizin eski sürümlerinde bu değer otomatik olarak denetlenmemiş olabilir ve kendiniz bir denetim yerleştirmeniz gerekebilir.
Önemli
MonoTouch 5.2'den bu yana bu özelliğin önceki bir sürümü mevcuttu, ancak yalnızca deneysel önizleme olarak sgen için kullanılabilirdi. Bu yeni, gelişmiş sürüm artık Boehm çöp toplayıcısı için de kullanılabilir.
Geçmişte Xamarin.iOS tarafından yönetilen iki tür nesne vardı: yalnızca yerel bir nesnenin (eş nesneler) çevresinde sarmalayıcı olan nesneler ve yeni işlevleri (türetilmiş nesneler) genişleten veya birleştirilmiş olanlar - genellikle fazladan bellek içi durum tutarak. Daha önce bir eş nesneyi durumla (örneğin, C# olay işleyicisi ekleyerek) genişletebiliyordu ancak nesnenin başvurulmamasına ve sonra toplanmasına izin verdik. Bu, daha sonra (örneğin, yönetilen nesneye geri çağrılan çalışma zamanı) Objective-C kilitlenmeye neden olabilir.
Yeni sistem, ek bilgileri depoladığında eş nesneleri çalışma zamanı tarafından yönetilen nesnelere otomatik olarak yükseltiyor.
Bu, aşağıdaki 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, toplanabilir hale geldiğinden kilitlenir cell
ve bu nedenle TouchDown
temsilcisi sarkan bir işaretçiye dönüşür.
Başvuru sayısı uzantısı, yönetilen nesnenin canlı kalmasını sağlar ve yerel nesnenin yerel kod tarafından korunması koşuluyla koleksiyonunu engeller.
Yeni sistem ayrıca bağlamalarda kullanılan çoğu özel yedekleme alanı gereksinimini de ortadan kaldırır. Bu, örneği canlı tutmak için varsayılan yaklaşımdır. Yönetilen bağlayıcı, yeni başvuru sayısı uzantısını kullanarak tüm bu gereksiz alanları uygulamalardan kaldıracak kadar akıllıdır.
Bu, her yönetilen nesne örneğinin öncekinden daha az bellek tükettiği anlamına gelir. Ayrıca, bazı yedekleme alanlarının çalışma zamanı tarafından Objective-C artık gerekli olmayan başvuruları barındırdığı ilgili bir sorunu çözer ve bu da belleği geri kazanmayı zorlaştırır.