0

NavigationController에서 포커스를 전달하는 여러 UIViewController로 구성된 메뉴 시스템이 있습니다. 대부분의 컨트롤러는 내 게임에서 CoursesManager < (UIViewController 아님)이라는 코스 관리에 대한 책임이있는 싱글 톤을 참조합니다 (조작하지 않은 경우). 작성 및 편집 시스템은 잘 작동하지만 데이터가 손실되거나 빈 (정크 데이터) 배열을 수신하여 CoursesManager에서 충돌이 발생하여 내 UIViewController 중 하나에서 일부 라벨을 업데이트하려고 할 때 문제가 계속 발생합니다. 이 데이터 손실은 항상 하나의 특정 "문제"(UIViewController *) ProblemViewController : viewDidAppear, viewWillAppear, viewDidDisappear 및 viewWillDisappear 중 하나의 메서드에서 발견됩니다.여러 UIViewController 데이터 손실로 싱글 톤 데이터 공유

필자의 이론은 ProblemUIViewController가 데이터에 액세스하려고 시도 할 때 데이터가 다른 UIViewController에서 계속 사용된다는 것입니다. 이 방법을 테스트하거나 수정하는 방법은 확실하지 않습니다. 나는 iPhone 프로그래밍에서 스레딩이 일반적으로 어떻게 작동하는지 조금 불투명합니다. ProblemUIViewController가 NavigationController 스택 맨 아래에 있기 때문에 이런 경우가있을 것 같습니다.

도움을 주시면 감사하겠습니다.

수정 다음은 내가받는 오류 메시지입니다.

는 - [CALayerArray isEqualToString는 :] : 미정 선택기 인해 캐치되지 않는 예외 'NSInvalidArgumentException'응용 프로그램 종료, 이유 인스턴스 0x2d31a0

* 전송 '- [CALayerArray isEqualToString는 :] : 미정 선택기로 전송 인스턴스 0x2d31a0 ' * 먼저 던져 호출 스택 : (0x3262288f 0x34678259 0x32625a9b 0x32624915 0x3257f650 0x3204d3f9 0x3141f 0x3123b 0x3208bb95 0x320e58af 0x3208e913 0x3208e503 0x320d88eb 0x320d8719 0x320bcbc1 0x343cb 0x3257c3fd 0x32064e07 0x32064dc3 0x32064da1 0x32064b11 0x32065449 012 3,516,0x3206392b 0x32063319 0x32049695 0x32048f3b 0x316d022b 0x325f6523 0x325f64c5 0x325f5313 0x325784a5 0x3257836d 0x316cf439 0x32077cd5 0x22c1 0x2280)의 예외 (lldb 던지고 호출 종료)의 코드가이 기능을 입력 할 때

이 예외가 발생 받고있다.

- (void) viewWillAppear : (BOOL) animated { [self refreshCourses]; [self toggleEditMode : NO]; }

- (void) refreshCourses { struct SCourse * courses = [coursesManager GetAllCourses];

for(int i = 0; i < MAX_COURSES; ++i) 
{ 
    // deactivate all buttons/labels 
    courseButtons[i].hidden = YES; 
    courseLabels[i].hidden = YES; 
    deleteButtons[i].hidden = YES; 

    // remake with current data 
    if(courses[i].inUse == YES) 
    { 
     switch (courses[i].size) 
     { 
      case 1: 
       [courseButtons[i] setImage:[UIImage imageNamed:@"sm_coursename_BG.png"] forState:UIControlStateNormal]; 
       break; 
      case 2: 
       [courseButtons[i] setImage:[UIImage imageNamed:@"med_coursename_BG.png"] forState:UIControlStateNormal]; 
       break; 
      case 4: 
       [courseButtons[i] setImage:[UIImage imageNamed:@"lg_coursename_BG.png"] forState:UIControlStateNormal]; 
       break; 

      default: 
       break; 
     } 

     courseLabels[i].text = courses[i].name; // exception thrown here on second iteration of loop with 2 courses to loop through 
     courseLabels[i].hidden = NO; 
     courseButtons[i].hidden = NO; 
    } // if 
} // for } 

- (무효) toggleEditMode : 싱글의 (BOOL) bMode {

bEditMode = bMode; 

if (bMode == YES) 
{   
    for (int i = 0; i < MAX_COURSES; ++i) 
    { 
     if(courseButtons[i].hidden == NO) 
     { 
      struct SCourse tempCourse = [coursesManager GetCourseAtIndex:i]; 
      courseLabels[i].text = [NSString stringWithFormat:@"(edit) %@", tempCourse.name]; 

      deleteButtons[i].hidden = NO; 
     } 
    } 
} 
else // bMode == NO 
{   
    for (int i = 0; i < MAX_COURSES; ++i) 
    { 
     if (courseButtons[i].hidden == NO) 
     { 
      struct SCourse tempCourse = [coursesManager GetCourseAtIndex:i]; 
      courseLabels[i].text = tempCourse.name; 
     } 

     deleteButtons[i].hidden = YES; 
    } 
} } 

방법은 모든 코스를 얻기 위해 호출되는 :

- (구조체 Scourse *) GetAllCourses { 반품 코스; }

coursesManager는 모든 데이터를 보유하는 나의 싱글 톤입니다.

+0

당신이 충돌 오류와 관련 코드를 게시하시기 바랍니다 수 있습니다. 감사합니다 – timthetoolman

+0

@ rkeller 좀 코드를 보여 주시겠습니까 –

+0

물론. 나는 그것을 업데이트했다. – rkeller

답변

1

isEqualToString :을 CALayerArray 객체에 보내고 CALayerArray 객체가 isEqualToString :에 응답하지 않기 때문에.

CALayerArray 개체에 의도적으로 메시지를 보내지 않았을 수 있습니다. 대신 일부 문자열 객체를 일부 CALayerArray 객체에 전달합니다.

아마도 데이터 구조에 대한 배열 포인터 중 하나를 CALayerArray로 설정했을 것입니다.

행운

T

+0

CALayerArray가 NSString 또는 NSMutableArray와 어딘지 혼합되어 있지 않으면 어디에서 그럴 수 있을지 잘 모르겠습니다. CALayerArray 객체가 없습니다. 귀하의 응답에서 나는 스레드간에 데이터를 공유하는 것에 대해 걱정할 필요가없는 것처럼 들립니다. 사실입니까? – rkeller

+0

스레딩 작업을 명시 적으로 수행하지 않는 한 스레드간에 데이터를 공유하지 않는 것일 수 있습니다. 다시 말하지만, 정확히 무엇을하고 있는지 확실하지 않습니다. 애니메이션이나 뷰 및 하위 뷰를 조작하고 있습니까? 그렇다면 애니메이션 코드를 확인하여 문자열이 CALayerArray에 전달되도록하는 작업을하고 있는지 확인할 수 있습니다. – timthetoolman