我有一个菜单系统,由几个UIViewControllers组成,焦点由NavigationController传递。大多数这些控制器引用(如果不操作)一个单例,它负责管理我的游戏中名为CoursesManager< - (不是UIViewController)的课程。创建和编辑系统运行良好,但我一直遇到一个问题,我丢失数据或接收一个空的(垃圾数据)课程数组导致CoursesManager在尝试更新我的一个UIViewControllers中的某些标签时崩溃。这种数据丢失总是在一个特定“问题”(UIViewController *)的下列方法之一中找到:ProblemViewController:viewDidAppear,viewWillAppear,viewDidDisappear和viewWillDisappear。
我的理论是,当ProblemUIViewController试图访问它时,另一个UIViewController仍会使用某种数据导致数据错误。我不确定如何测试或解决这个问题。我对iPhone编程中的线程如何工作也有点朦胧。由于ProblemUIViewController位于NavigationController堆栈的底部,因此我认为这也是可能的。
非常感谢任何帮助。
修改 这是我收到的错误消息。
- [CALayerArray isEqualToString:]:无法识别的选择器发送到实例0x2d31a0
*由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:' - [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 0x3206392b 0x32063319 0x32049695 0x32048f3b 0x316d022b 0x325f6523 0x325f64c5 0x325f5313 0x325784a5 0x3257836d 0x316cf439 0x32077cd5 0x22c1 0x2280)终止调用抛出异常(lldb)
当代码进入此函数时,会抛出此异常。
- (void)viewWillAppear:(BOOL)animated { [自我更新课程]; [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 }
- (void)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; } } }
调用单身人士获取所有课程的方法:
coursesP是我的单身人士,其中包含所有数据。- (struct SCourse *)GetAllCourses { 回归课程; }
答案 0 :(得分:1)
因为您正在向CALayerArray对象发送isEqualToString:并且CALayerArray对象不响应isEqualToString:。
您可能没有故意将该消息发送到CALayerArray对象;相反,您将一些字符串对象传递给某些CALayerArray对象。
也许您不小心将数据结构的一个数组指针设置为CALayerArray。
祝你好运Ť