与多个UIView控制器数据丢失共享单例数据



我有一个由几个UIView控制器组成的菜单系统,焦点由导航控制器传递。 这些控制器中的大多数都引用(如果不是操纵)一个单例,该单例负责管理我的游戏中名为 CoursesManager <-(不是 UIViewController)的课程。 创建和编辑系统运行良好,但是我一直遇到一个问题,即在尝试更新其中一个UIViewControllers中的某些标签时,我丢失了数据或收到空(垃圾数据)课程数组,从而导致CoursesManager崩溃。 这种数据丢失总是在一个特定"问题"(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)animation { [自助更新课程]; [自切换编辑模式:否];}

-(无效)刷新课程 { 结构 SCourse* 课程 = [课程经理获取全部课程];

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;
    }
}  }

调用单例以获取所有课程的方法:

-(struct SCourse*)GetAllCourses { 返回课程;}

课程管理器是我的单例,它保存所有数据。

因为您要将 isEqualToString: 发送到 CALayerArray 对象

,而 CALayerArray 对象不响应 isEqualToString:。

您可能不是有意将该消息发送到 CALayerArray 对象;相反,您将一些字符串对象传递给某些 CALayerArray 对象。

也许您不小心将数据结构的数组指针之一设置为 CALayerArray。

祝你好运

T

最新更新