2011-04-11 16 views
10

benim MonoTouch uygulama bazen sadece bir anı uyarı aldıktan sonra çöküyor sorun yaşıyorum. Lütfen aşağıdaki yığın izlemesine bakın.:: viewController bulunamadı yapıcı. Ctor (System.IntPtr)

 
Received memory warning. Level=2 
DTMobileIS[2299] : _memoryNotification : { 
     OSMemoryNotificationLevel = 2; 
     timestamp = "2011-04-11 14:29:09 +0000"; 
    } 
Toplevel exception: System.MissingMethodException: No constructor found for Myapp.UI.BoardController::.ctor(System.IntPtr) 
    at System.Activator.CreateInstance (System.Type type, BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes) [0x00000] in :0 
    at System.Activator.CreateInstance (System.Type type, System.Object[] args, System.Object[] activationAttributes) [0x00000] in :0 
    at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in :0 
    at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (IntPtr ptr, IntPtr klass) [0x00000] in :0 
    at MonoTouch.ObjCRuntime.Runtime.GetNSObject (IntPtr ptr) [0x00000] in :0 
    at MonoTouch.ObjCRuntime.Runtime.GetNSObjectWrapped (IntPtr ptr) [0x00000] in :0 
    at (wrapper native-to-managed) MonoTouch.ObjCRuntime.Runtime:GetNSObjectWrapped (intptr) 
    at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in :0 
    at Myapp.Free.Application.Main (System.String[] args) [0x00000] in /Users/haakon/Code/Myapp-work/iOS/Myapp.Free/Myapp.Free/Main.cs:12 

yığın izleme bu belirtilen (A UIViewController alt sınıfı BoardController) bir ıntptr parametre alan bir kurucu yoksun doğrudur. Ama bu benim uygulamada hiç Interface Builder kullanmadığımdan kasıtlıdır. Peki bu neden oluyor?

Ben Görünümlerinizin (veya muhtemelen görünüm kontrolörleri) toplanan çöp olmasına izin de bu olur önermek gibiydi benzer bir soru buldum. Ama bunun nasıl olabileceğini göremiyorum. Bazı arka plan: Uygulama temsilcisim, gezinme kümesindeki kök görüntüleme denetleyicisine güçlü bir başvuruda bulunan bir gezinti denetleyicisine güçlü bir başvuruda bulunur. Bu kök görüntüleme denetleyicisi ayrıca BoardController örneğine güçlü bir başvuru içerir. Bu yüzden BoardController'ın çöp toplanmasını nasıl mümkün olduğunu anlamıyorum.

Herhangi bir fikrin var mı?

cevap

9

IntPtr kurucu, yerel bir nesnenin yönetilen bir nesneye yüzeylenmesi gerektiğinde kullanılır. Bu özel durumda, böyle oluşturma olabilir:

var foo = new Foo(); 
SomeObject.Property = foo; 

Bu özelliğine Foo nesnesi atar, fakat Mülkiyet bir Objective-C nesne ise, referans için tutmazsanız "foo "Sonra Mono's GC, yönetilen Foo ve yönetilmeyen Foo arasındaki bağlantıyı sürdürecek ve atacak. yeni bir tane oluşturmak için vardır, böylece MonoTouch, hiçbir yönetilen nesne kendisine haritalar daha artık orada olduğunu bilecek, İşte

var bar = SomeObject.Property; 

, ancak tüm:

Sonra daha sonra, bunu almak için deneyin Objective-C kodunun IntPtr'idir. Bu yüzden kurucuya ihtiyacın var.

sadece yerli yapıcı eklemek için cazip olabilir ve bu birçok durumda ince, ama senin nesne örneğin yönetilen dünyada saklanan kendi durumunu, varsa bu bir sorundur

:

public class Foo : UIView { 
    string Name; 
    public Foo() { Name= "Hello"; } 
    public Foo (IntPtr ptr) : base (ptr) {} 
} 

Bu durumda, IntPtr kurucusu yönetilen nesneyi ve durumunu yalnızca IntPtr'ten tamamen yeniden yapılandıramaz. Bu yüzden probleminizin muhtemel kaynağı, nesnenize referans göstermemenizdir.

Yani kısacası gerçek düzeltmedir: Hala daha sonra kullanmak üzere olunca toplanan nesneyi önlemek için yönetilen kod içinde BoardController bir başvuru tutun.

+0

THANK. SEN. MIGUEL !!!! Ben bunun için yaşlarımda güreştim. Mantıksal + modal denetleyicileri değiştirerek bazı garip nav/tab/single/dialog root view controller'ım var. Ne yazık ki google istisna msg ... o kadar uzun sürdü ne bilmiyorum ama hepsi şimdi tam anlamıyla geliyor! – Tyson