2012-06-28 2 views
1

У меня есть класс, полученный из UIControl, называемый MyObject, и у меня также есть Список, который содержит несколько объектов в MyObject.Правильный способ удаления нежелательного подсмотра и его удаления в Monotouch

Все эти объекты добавляются как SubViews в переопределенном методе ViewDidLoad UIViewController перед вызовом base.ViewDidLoad(); (Я не знаю, важно ли это).

Дело в том, что в определенные периоды я хочу удалить несколько объектов, потому что они мне больше не нужны. Вот что я делаю: - Прежде всего, я удаляю этот объект из моей общей коллекции списков - Затем я удаляю его из представления с помощью метода RemoveFromSuperview(). На этом этапе все работает хорошо, но я также хочу избавиться от него из памяти, потому что мне он больше не нужен, и мне также нужно добавить еще несколько объектов, поэтому мне нужно освободить память. Поэтому я вызываю метод Dispose() на этом объекте.

Как только я это делаю я получаю неприятное исключение:

Stacktrace: 

at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging.void_objc_msgSendSuper_RectangleF (intptr,intptr,System.Drawing.RectangleF) <IL 0x00025, 0xffffffff> 
at MonoTouch.UIKit.UIView.set_Frame (System.Drawing.RectangleF) [0x00021] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIView.g.cs:1179 
at BubbleBuster.Lib.UI.Gameplay.Bubble.Update (System.Drawing.RectangleF) [0x001a2] in /Development/Helix/iOS/BubbleBuster/BubbleBusterSolution/BubbleBusterApp/Lib/UI/Gameplay/Bubble.cs:141 
at BubbleBuster.Lib.UI.Gameplay.BubbleCollection/<Update>c__AnonStorey2.<>m__4 (BubbleBuster.Lib.UI.Gameplay.Bubble) [0x00014] in /Development/Helix/iOS/BubbleBuster/BubbleBusterSolution/BubbleBusterApp/Lib/UI/Gameplay/BubbleCollection.cs:21 
at System.Collections.Generic.List`1.ForEach (System.Action`1<T>) [0x00018] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Collections.Generic/List.cs:360 
at BubbleBuster.Lib.UI.Gameplay.BubbleCollection.Update (System.Drawing.RectangleF) [0x00014] in /Development/Helix/iOS/BubbleBuster/BubbleBusterSolution/BubbleBusterApp/Lib/UI/Gameplay/BubbleCollection.cs:19 
at BubbleBuster.Lib.UI.Screens.WelcomeScreen.<UpdateTime_Elapsed>m__1() [0x00000] in /Development/Helix/iOS/BubbleBuster/BubbleBusterSolution/BubbleBusterApp/Lib/UI/Screens/WelcomeScreen.cs:44 
at MonoTouch.Foundation.NSActionDispatcher.Apply() [0x00000] in /Developer/MonoTouch/Source/monotouch/src/shared/Foundation/NSAction.cs:48 
at (wrapper runtime-invoke) object.runtime_invoke_void__this__ (object,intptr,intptr,intptr) <IL 0x0004e, 0xffffffff> 
at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff> 

Thread started: 
at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00042] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29 
at BubbleBuster.Application.Main (string[]) [0x00000] in /Development/Helix/iOS/BubbleBuster/BubbleBusterSolution/BubbleBusterApp/Main.cs:17 
at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff> 

Native stacktrace: 

0 BubbleBusterApp      0x0009094c mono_handle_native_sigsegv + 284 
1 BubbleBusterApp      0x00005cd8 mono_sigsegv_signal_handler + 248 
2 libsystem_c.dylib     0x9923959b _sigtramp + 43 
3 ???         0xffffffff 0x0 + 4294967295 
4 ???         0x0e2662b8 0x0 + 237396664 
5 ???         0x0e2661dc 0x0 + 237396444 
6 ???         0x0e2651c6 0x0 + 237392326 
7 ???         0x0e269920 0x0 + 237410592 
8 ???         0x0e24f8e2 0x0 + 237304034 
9 ???         0x0e2697e4 0x0 + 237410276 
10 ???         0x0e269678 0x0 + 237409912 
11 ???         0x0e2695e0 0x0 + 237409760 
12 ???         0x09fe9a90 0x0 + 167680656 
13 BubbleBusterApp      0x0000a042 mono_jit_runtime_invoke + 722 
14 BubbleBusterApp      0x00169f4e mono_runtime_invoke + 126 
15 BubbleBusterApp      0x00206748 monotouch_trampoline + 3416 
16 CoreFoundation      0x011d6e42 -[NSObject performSelector:withObject:] + 66 
17 Foundation       0x017509df __NSThreadPerformPerform + 254 
18 CoreFoundation      0x011a994f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15 
19 CoreFoundation      0x0110cb43 __CFRunLoopDoSources0 + 243 
20 CoreFoundation      0x0110c424 __CFRunLoopRun + 1012 
21 CoreFoundation      0x0110bd84 CFRunLoopRunSpecific + 212 
22 CoreFoundation      0x0110bc9b CFRunLoopRunInMode + 123 
23 GraphicsServices     0x047c47d8 GSEventRunModal + 190 
24 GraphicsServices     0x047c488a GSEventRun + 103 
25 UIKit        0x02258626 UIApplicationMain + 1163 
26 ???         0x0d7c4a05 0x0 + 226249221 
27 ???         0x0d53cf18 0x0 + 223596312 
28 ???         0x0d53cc10 0x0 + 223595536 
29 ???         0x0d53cd66 0x0 + 223595878 
30 BubbleBusterApp      0x0000a042 mono_jit_runtime_invoke + 722 
31 BubbleBusterApp      0x00169f4e mono_runtime_invoke + 126 
32 BubbleBusterApp      0x0016e034 mono_runtime_exec_main + 420 
33 BubbleBusterApp      0x00173455 mono_runtime_run_main + 725 
34 BubbleBusterApp      0x00067245 mono_jit_exec + 149 
35 BubbleBusterApp      0x002116a5 main + 2837 
36 BubbleBusterApp      0x00003095 start + 53 

================================================================= 
Got a SIGSEGV while executing native code. This usually indicates 
a fatal error in the mono runtime or one of the native libraries 
used by your application. 
================================================================= 
+0

Вам не нужно вручную вызывать Dispose() для просмотра. Бывают ситуации, когда _you_, возможно, больше не содержит очевидной ссылки, но, возможно, что-то еще делает внутри. GC очистит удаленное представление, если вы просто установите переменные, ссылающиеся на NULL. – Krumelur

ответ

2

Отсюда:

at MonoTouch.UIKit.UIView.set_Frame (System.Drawing.RectangleF) [0x00021] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIView.g.cs:1179 

это выглядит, как вы устанавливаете кадр на мнении, что уже освобожденным.

1

При создании вида, установите его тег 333 т.е. Распоряжаться мнение: MyCreatedView.ViewWithTag (333) .RemoveFromSuperview();

Где -MyCreatedView- это родительский вид представления, из которого вы хотите избавиться.