2012-10-31 117 views
2

我收到以下錯誤應用.....點擊按鈕崩潰,unhandeled例外

tacktrace:

在(包裝託管到本機)MonoTouch.UIKit.UIApplication.UIApplicationMain( int,string [],intptr,intptr) at MonoTouch.UIKit.UIApplication.Main(string [],string,string)/Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38中的[0x0004c] (包裝器運行時調用)處的F2S.UI.Application.Main(字符串[])[0x00000]處的 /Users/ravichandra/Desktop/19-10-2012/F2S/F2S.UI/Main.cs:。 .runtime_invoke_void_object(對象,IntPtr的,IntPtr的,IntPtr的)

本地堆棧跟蹤:

0 navigation       0x00090dfc mono_handle_native_sigsegv + 284 
1 navigation       0x00005c28 mono_sigsegv_signal_handler + 248 
2 libsystem_c.dylib     0x9ca8259b _sigtramp + 43 
3 ???         0xffffffff 0x0 + 4294967295 
4 UIKit        0x0223555a -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61 
5 UIKit        0x022dab76 -[UIControl sendAction:to:forEvent:] + 66 
6 UIKit        0x022db03f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503 
7 UIKit        0x022da2fe -[UIControl touchesEnded:withEvent:] + 549 
8 UIKit        0x0225aa30 -[UIWindow _sendTouchesForEvent:] + 513 
9 UIKit        0x0225ac56 -[UIWindow sendEvent:] + 273 
10 UIKit        0x02241384 -[UIApplication sendEvent:] + 464 
11 UIKit        0x02234aa9 _UIApplicationHandleEvent + 8196 
12 GraphicsServices     0x047f6fa9 PurpleEventCallback + 1274 
13 CoreFoundation      0x0119c1c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53 
14 CoreFoundation      0x01101022 __CFRunLoopDoSource1 + 146 
15 CoreFoundation      0x010ff90a __CFRunLoopRun + 2218 
16 CoreFoundation      0x010fedb4 CFRunLoopRunSpecific + 212 
17 CoreFoundation      0x010feccb CFRunLoopRunInMode + 123 
18 GraphicsServices     0x047f5879 GSEventRunModal + 207 
19 GraphicsServices     0x047f593e GSEventRun + 114 
20 UIKit        0x02232a9b UIApplicationMain + 1175 
21 ???         0x0d90a384 0x0 + 227582852 
22 ???         0x0d909180 0x0 + 227578240 
23 ???         0x0d9089a0 0x0 + 227576224 
24 ???         0x0d908a2f 0x0 + 227576367 
25 navigation       0x00009fe2 mono_jit_runtime_invoke + 722 
26 navigation       0x0016b87e mono_runtime_invoke + 126 
27 navigation       0x0016fa04 mono_runtime_exec_main + 420 
28 navigation       0x00174df5 mono_runtime_run_main + 725 
29 navigation       0x000671e5 mono_jit_exec + 149 
30 navigation       0x00203e41 main + 2209 
31 navigation       0x00002fe5 start + 53 
32 ???         0x00000005 0x0 + 5 

==================================== ============================= 執行本機代碼時得到了一個SIGSEGV。這通常表示 單聲道運行時或其中一個本機庫中的致命錯誤。

============================================== ===================

請人幫我

這裏是我的代碼

 btnMylocation.Clicked += (sender, e) => 
     { 
      imgbg.Hidden=false; 
      lbltime.Hidden=false; 
      btnup.Hidden=false; 
      btndown.Hidden=false; 
      imghazard.Hidden=false; 
      lblfeets.Hidden=false; 


      try 
      { 
       if(!Reachability.IsHostReachable ("www.google.com")) 
       { 

        alertview.NetworkFail(); 

       } 

       else 
       { 

       this.mysegments.SelectedSegment = 0; 

       mapView.RemoveAnnotations (mapView.Annotations); 

       var locationservice = new LocationService(); 
       var currentLocation = locationservice.GetCurrentLocation(); 
       var visregion = BuildVisibleRegion (currentLocation); 

       mapView.SetRegion (visregion, true); 
       targetimage.Hidden = true; 

       locations = LocationManager.Locations(); 

       List<double> distlist=new List<double>(); 

       foreach(LocationModel d in locations) 
       { 

        var dist=distance (currentLocation.Latitude,currentLocation.Longitude,Convert.ToDouble (d.latitude),Convert.ToDouble (d.longitude)); 
        distlist.Add (dist); 

       } 
       if(distlist.Count!=0) 
       { 

        distlist.Sort(); 
        double min= distlist[0]; 

       foreach (LocationModel f in locations) 
       { 

        string feets = (min*3280).ToString(); 

        var dist=distance (currentLocation.Latitude,currentLocation.Longitude,Convert.ToDouble (f.latitude),Convert.ToDouble (f.longitude)); 

        if(min == dist) 
        { 
         string lat = f.latitude; 
         string lon = f.longitude; 
         NSUserDefaults.StandardUserDefaults.SetString (f.hazardid,"hazardid"); 

         this.View.AddSubview (imgbg); 
         this.View.AddSubview (imghazard); 
         this.View.AddSubview (lblfeets); 
         this.View.AddSubview (btnup); 
         this.View.AddSubview (btndown); 
         this.View.AddSubview (lbltime); 

        if (f.hazardtype == 1) 
        { 

         pins.Clear(); 
         pins.Add (new PoliceAnnotation (new CLLocationCoordinate2D (Convert.ToDouble (lat), Convert.ToDouble (lon)), "Click here to Report","")); 
         mapView.AddAnnotationObject (pins [0]); 
         mapView.AddAnnotation (mapAnnotations [(int)Anotationindex.police]); 

         lblfeets.Text=feets + " fts"; 
         lbltime.Text=f.ReportDate + " Ago"; 
         imghazard.Image=UIImage.FromFile ("Images/police-cop-mark.png"); 

        } 

        else if (f.hazardtype == 2) 
        { 

         duipins.Clear(); 
         duipins.Add (new DuiAnnotation (new CLLocationCoordinate2D (Convert.ToDouble (lat), Convert.ToDouble (lon)), "Click here to Report","")); 
         mapView.AddAnnotationObject (duipins [0]); 
         mapView.AddAnnotation (mapAnnotations [(int)Anotationindex.dui]); 


         lblfeets.Text=feets + " fts"; 
         lbltime.Text=f.ReportDate + " Ago"; 
         imghazard.Image=UIImage.FromFile ("Images/dui-stop-mark.png");  

        } 
        else if(f.hazardtype==3) 
        { 

         campins.Clear(); 
         campins.Add (new SpeedcamAnnotation (new CLLocationCoordinate2D (Convert.ToDouble (lat), Convert.ToDouble (lon)), "","")); 
         mapView.AddAnnotationObject (campins [0]); 
         mapView.AddAnnotation (mapAnnotations [(int)Anotationindex.cam]); 


         lblfeets.Text=feets + " fts"; 
         lbltime.Text=f.ReportDate + " Ago"; 
         imghazard.Image=UIImage.FromFile ("Images/speed-camera-mark.png"); 

        } 

        } 

        } 

        btnup.TouchUpInside += (sender1, e1) => 
        { 

        NSUserDefaults.StandardUserDefaults.SetString("1","Status"); 
        NSUserDefaults.StandardUserDefaults.Init(); 
        Response = LocationManager.ConfirmLocation(); 

        if(Response.Status == "1" || Response.Status == "12") 
        { 
         UIAlertView alert1 = new UIAlertView ("Success","",null,"Ok"); 
         alert1.Show(); 
        } 
        else 
        { 

        } 

        }; 

        btndown.TouchUpInside += (sender1, e1) => 
        { 

        NSUserDefaults.StandardUserDefaults.SetString("0","Status"); 
        NSUserDefaults.StandardUserDefaults.Init(); 
        Response = LocationManager.ConfirmLocation(); 

        if(Response.Status == "1" || Response.Status == "12") 
        { 
         UIAlertView alert1 = new UIAlertView ("Success","",null,"Ok"); 
         alert1.Show(); 
        } 
        else 
        { 

        } 

        }; 

        } 

       } 

       } 
      catch(Exception ex) 
      { 

       if(ex.Message == "Network Fail") 

        alertview.NetworkFail(); 

       else 

        alertview.ProcessFailed(); 

       } 

      }; 

點擊第一次btnMylocation顯示彈出與兩個按鈕,並點擊兩個按鈕工作正常,但是當我試圖再次點擊btnMylocation它打開彈出窗口,但點擊兩個按鈕中的任何一個btnup和btndown崩潰的應用程序.......任何想法請.. ..

+1

它看起來像GC釋放了按鈕,因爲沒有人保留對它的引用。你可以顯示你的代碼,所以我們可以肯定嗎? –

回答

1

Rolf是對的,有一種方法可以通過不正確地設置事件來發生這種崩潰。這是GC與MonoTouch中Objective-C交互的方式。

因此,舉例來說,如果你把這個ViewDidLoad名爲myButton的出口,這將很好地工作:

myButton.TouchUpInside += (sender, e) => 
{ 
    //Do something 
}; 

但是,如果你這樣做:

myButton1.TouchUpInside += (sender, e) => 
{ 
    var myButton2 = new UIButton(); 
    myButton2.TouchUpInside += (sender, e) => 
    { 
    //Do something 
    }; 
    //Add button2 to the view, etc. 
}; 

然後myButton2會點擊適當或許這是第一次,但最終你會在GC收集後發生崩潰。發生這種情況的原因是myButton2的C#包裝將收集GarBarge,但Objective-C實例仍然存在。當Objective-C實例獲得點擊時,它不能調用到C#中,因爲它消失了。

一個簡單的方法來解決它,從而使按鈕類的成員變量:

private UIButton myButton;

只要確保不要一遍又一遍地創建它。

+0

我同意這個解決方法 - 但是你已經說明的情況下的崩潰是一個MT錯誤,不是嗎?我不認爲myButton2應該在這種情況下收集垃圾,應該嗎? (只是檢查我明白!) – Stuart

+0

不是一個真正的錯誤,而是一個限制。我不確定他們可以做些什麼來解決它。它現在的工作方式是,如果C#包裝器對象被釋放/ GC'd,它將釋放它的相應Objective-C對象,如果它的引用計數爲零 - 這就是Objective-C中內存管理的工作方式。但是在這種情況下,引用計數不是零,因爲它仍然在屏幕上和一系列子視圖中。 – jonathanpeppers

+0

是的,我得到了它的感謝..... –