【问题标题】:Sharing singleton data with several UIViewControllers data loss与多个 UIViewController 共享单例数据丢失数据
【发布时间】:2012-06-27 22:59:03
【问题描述】:

我有一个由几个 UIViewController 组成的菜单系统,焦点由 NavigationController 传递。这些控制器中的大多数都引用(如果不操纵)一个单例,该单例负责管理我的游戏中的课程,称为 CoursesManager

我的理论是,当 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 { [自我刷新课程]; [自我切换编辑模式:否]; }

-(void)refreshCourses { struct SCourse* 课程 = [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;
    }
}  }

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

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

coursesManager 是我保存所有数据的单身人士。

【问题讨论】:

  • 能否请您发布崩溃错误和相关代码。谢谢
  • @rkeller 你能显示一些代码吗
  • 当然可以。我已经更新了。

标签: objective-c memory-management uiviewcontroller singleton data-loss


【解决方案1】:

因为您将 isEqualToString: 发送到 CALayerArray 对象,而 CALayerArray 对象不响应 isEqualToString:.

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

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

祝你好运

T

【讨论】:

  • 除非 CALayerArray 以某种方式与 NSString 或 NSMutableArray 混合在一起,否则我不确定我可能会在哪里这样做。我没有任何 CALayerArray 对象。从您的回复看来,我不应该担心在线程之间共享数据。这是真的吗?
  • 除非您明确地进行线程工作,否则您可能不会在线程之间共享数据。同样,不确定您在做什么。你在做任何动画或操作视图和子视图吗?如果是这样,您可能需要检查您的动画代码,看看您是否正在做一些会导致将字符串传递给 CALayerArray 的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多