OBJ_STACK_OVERFLOW 또는 EXC_BAD_ACCESS 예외를 일으키는 "정상"UIBIRTTON
-
07-07-2019 - |
문제
확실히 무해 해 보입니다. 내 앱 대의원에서는 확인합니다 NSUSERDEFAULTS 스타트 업에서 팁을 표시하는 깃발. 그것이 설정되면, 끝에 applicationDidFinishLaunching:
, 나는 이것을한다:
TipsViewController *vc = [[TipsViewController alloc]
initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];
아이디어는이 견해를 일시적으로 보여주는 것입니다. (이 시점에서 내비게이션 컨트롤러가 없으며 어쨌든이보기에는 내비게이션 막대가 없습니다.)
이 견해가 기각되면 선점을 추가 할 것입니다. Uitabbarcontroller창을 보는 것과 그로 전환 한 다음 기본 창에서 팁보기를 제거하십시오. 나는 아직도 독서를 계속하기 때문에 아직 해고 지점에 이르지 못했습니다.
내 TIPSVIEW의 VC는 다음과 같이 다소 연결되어 있습니다.
UIView -> view -> File’s Owner (TipsViewController)
UIImageView -> background image
UIView -> tipView -> File’s Owner
UIImageView -> background image
UIScrollView
UILabel (tip text)
UIButton -> touch-up-inside -> -(IBAction)button1:
UIButton -> touch-up-inside -> -(IBAction)button2:
UIButton -> touch-up-inside -> -(IBAction)button3:
소스에는 세 가지 모두에 대한 선언과 정의가 포함되어 있습니다 iBaction 전화. 지금 그들 중 두 명은 아무것도하지 않습니다. 세 번째는 팁을 변경합니다 text
, 적합하도록 크기를 조정하고 스크롤보기를 조정합니다. contentSize
일치합니다.
앱을 실행할 때 TipsViewController 보기는 잘 나타납니다. 팁 텍스트를 스크롤 할 수도 있습니다. 그러나, 내가 터치 업 안드 사이드를 트리거 할 때 UIBIRTTON, Xcode는 소스에 나를 심기 시작합니다 (각각의 중단 점을 배치 한 위치 iBaction)… EXC_BAD_ACCESS
또는 obj_stack_overflow
.
VC,보기 및 버튼이있는 앱의 다른 부분과 이것을 비교했습니다. 이 경우 모든면에서 동일합니다. VC의보기를 VC를 탐색 컨트롤러에 밀어 넣는 대신 앱 창의 서브 뷰로 추가했습니다.. 또한, iPhone OS 용 컨트롤러 프로그래밍 안내서보기 문서는 이것이 공정한 게임이라고 말합니다.
애플리케이션에서 단일보기 컨트롤러를 사용하는 경우 뷰 컨트롤러를 탭 막대 또는 탐색 컨트롤러에 추가하는 대신 뷰를 창에 추가합니다.
사실, i 하다 가지고있다 Uitabbarcontroller 날개를 기다리고 있으며 탭이 있습니다. uinavigationcontrollers (및 기타 VC). 그러나 팁보기가 표시되면 탭 바 컨트롤러의보기에는 ~ 아니다 그러나 창에 추가되었습니다. 우리가 팁을 보여준 후에 교체하는 것입니다. 다시 말해, 모든 의도와 목적을 위해, 우리는 단일 VC를 가지고있는 것처럼 일시적으로 행동하고 있습니다. 그 후, 우리는 탭 바로 전환하고 팁 VC를 찢습니다.
아마도 내가 미묘하게 잘못한 일을하고 있을까요? 더 좋은 방법이 있습니까? (“더 나은 방법이 있어야합니다!”)
샘플 스택 추적 :
#0 0x992b6f52 in objc_exception_throw
#1 0x302d6ffb in -[NSObject doesNotRecognizeSelector:]
#2 0x3026e056 in ___forwarding___
#3 0x3024a0a2 in __forwarding_prep_0___
#4 0x308f79d1 in -[UIApplication sendAction:to:from:forEvent:]
#5 0x309598b1 in -[UIControl sendAction:to:forEvent:]
#6 0x3095bad2 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#7 0x3095a81e in -[UIControl touchesEnded:withEvent:]
#8 0x30910fdf in -[UIWindow _sendTouchesForEvent:]
#9 0x308faecb in -[UIApplication sendEvent:]
#10 0x309013e1 in _UIApplicationHandleEvent
#11 0x32046375 in PurpleEventCallback
#12 0x30245560 in CFRunLoopRunSpecific
#13 0x30244628 in CFRunLoopRunInMode
#14 0x32044c31 in GSEventRunModal
#15 0x32044cf6 in GSEventRun
#16 0x309021ee in UIApplicationMain
#17 0x00002888 in main at main.m:14
트레이스에서 볼 수 있듯이, 우리는 doesNotRecognizeSelector:
… 팁 VC 소스에서 메소드를 명확하게 볼 수 있습니다. 또한, 그들은 모두 연결되어 있습니다. (IB에서는 여러 배선이나 그와 비슷한 것이 없습니다. 파일의 소유자 관계까지 모든 것이 좋아 보입니다.)
단서를 환영합니다/감사합니다!
해결책
첫 번째 코드 스 니펫에 문제가 있습니다. TipsViewController 인스턴스를 만들어 뷰를 유지 한 다음 View Controller를 공개합니다. 이제 target
버튼 중 하나는 처리 된 뷰 컨트롤러에 대한 포인터입니다.
View는 View Controller를 유지하지 않으며 대의원이나 목표를 유지하지도 않습니다.
뷰 컨트롤러 인스턴스를 유지해야합니다. retain
속성 -보기가 표시되기를 원하는 한. 보기가 완료되면 부모보기에서 뷰를 제거하고 뷰 컨트롤러를 해제 할 수 있습니다.