2012-03-19 2 views
2

강령 :

UIButton rightButton = UIButton.FromType (UIButtonType.DetailDisclosure); 

rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); }; 

스택 트레이스 :

...MonoTouch는 SIGSEGV가 발생합니다

기본 스택 트레이스

:

0 taggr        0x000908fc mono_handle_native_sigsegv + 284 
1 taggr        0x00005c98 mono_sigsegv_signal_handler + 248 
2 libsystem_c.dylib     0x95c2859b _sigtramp + 43 
3 ???         0xffffffff 0x0 + 4294967295 
4 UIKit        0x0219355a -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61 
5 UIKit        0x02238b76 -[UIControl sendAction:to:forEvent:] + 66 
6 UIKit        0x0223903f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503 
7 UIKit        0x022382fe -[UIControl touchesEnded:withEvent:] + 549 
8 UIKit        0x021b8a30 -[UIWindow _sendTouchesForEvent:] + 513 
9 UIKit        0x021b8c56 -[UIWindow sendEvent:] + 273 
10 UIKit        0x0219f384 -[UIApplication sendEvent:] + 464 
11 UIKit        0x02192aa9 _UIApplicationHandleEvent + 8196 
12 GraphicsServices     0x0478afa9 PurpleEventCallback + 1274 
13 CoreFoundation      0x011951c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53 
14 CoreFoundation      0x010fa022 __CFRunLoopDoSource1 + 146 
15 CoreFoundation      0x010f890a __CFRunLoopRun + 2218 
16 CoreFoundation      0x010f7db4 CFRunLoopRunSpecific + 212 
17 CoreFoundation      0x010f7ccb CFRunLoopRunInMode + 123 
18 GraphicsServices     0x04789879 GSEventRunModal + 207 
19 GraphicsServices     0x0478993e GSEventRun + 114 
20 UIKit        0x02190a9b UIApplicationMain + 1175 
21 ???         0x09ff8784 0x0 + 167741316 
22 ???         0x09ff79d0 0x0 + 167737808 
23 ???         0x09ff7878 0x0 + 167737464 
24 ???         0x09ff7907 0x0 + 167737607 
25 taggr        0x0000a002 mono_jit_runtime_invoke + 722 
26 taggr        0x00169efe mono_runtime_invoke + 126 
27 taggr        0x0016dfe4 mono_runtime_exec_main + 420 
28 taggr        0x00173405 mono_runtime_run_main + 725 
29 taggr        0x00067205 mono_jit_exec + 149 
30 taggr        0x002116d5 main + 2837 
31 taggr        0x00003055 start + 53 

을 얻었다 네이티브 코드를 실행하는 동안 SIGSEGV. 이것은 대개 모노 런타임 또는 응용 프로그램에서 사용하는 기본 라이브러리 중 하나에서 치명적인 오류를 나타냅니다.

답변

4

해당 코드는 컨텍스트에 따라 옳고 그름입니다. 이처럼 사용할 있기 때문에 이제 (스택 추적 포함)가 잘못 가정 해 봅시다 : 메서드가 반환되면 (가비지 컬렉터에 의해)이 경우 rightButton에서

void BadCase() 
{ 
    UIButton rightButton = UIButton.FromType (UIButtonType.DetailDisclosure); 
    rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); }; 
} 

를 수집 할 수 있습니다 (지역 변수에는 관리 기준이 없기 때문에) . 그러나 네이티브 버튼이 계속 존재할 수 있으며 터치 이벤트가 발생하면 콜백 ( 관리 코드로)을 시도합니다. 이로 인해 충돌이 발생합니다 ( 관리 인스턴스가 수집 된 이후).

UIButton rightButton; 

void GoodCase() 
{ 
    rightButton = UIButton.FromType (UIButtonType.DetailDisclosure); 
    rightButton.TouchUpInside += (o, e) => { Console.WriteLine("hello"); }; 
} 

버튼에 대한 참조를 유지하면 쉽게 피할 수 있습니다. 그것을 지역 변수에서 필드로 승격시킴으로써. 이렇게하면 GC가 관리 된 버튼을 수집 할 때 (유형의) 인스턴스가 삭제 될 때까지 버튼이 표시되지 않습니다. 즉 네이티브 버튼은 랜드로 다시 전화하여 hello을 출력 할 수 있습니다.

+0

Poupou 고맙습니다. 설명은 훌륭합니다. –

+0

오신 것을 환영합니다 :-) OTOH 사람들이 stackoverflow에 감사하는 올바른 방법은 upvote (오렌지색 위쪽 화살표)로 답변 (또는 질문)을하고 ** 그것이 문제/질문을 해결 한 후에 표시 (회색/녹색 체크 표시 투표 아래) 답변으로 질문 (그래서 다른 사람들이 검색을 너무 그것을 찾을 수 있습니다). – poupou

+0

너 Poupou있어! 귀하의 회신이 내 문제를 해결했습니다. 해결 된 것으로 표시합니다. –

관련 문제