不同对象中具有相同名称的两个变量改变彼此的值

Posted

技术标签:

【中文标题】不同对象中具有相同名称的两个变量改变彼此的值【英文标题】:Two variables with the same name in different objects altering each others' values 【发布时间】:2013-11-13 20:05:41 【问题描述】:

我有两个UITableView 对象,它们都有一个名为sectionHeaders 的数组,该数组用作引用对象,毫不奇怪地为表中的给定部分提供标题名称。第一个表视图将其作为NSMutableArray 并根据需要动态添加标题。第二个视图使用NSArray 并使用@[item1, item2, ...] 简写创建数组。两个对象都被声明为全局实例变量。

第一个表视图创建第二个表视图并将其推送到导航控制器堆栈。标题在第一次显示前一个视图时正确显示,并且在显示后一个视图时它们总是正确显示,但是当我回击返回第一个视图时,部分标题与第二个视图的标题匹配。通过更改两个变量名之一可以立即解决此问题,但我更愿意首先了解为什么会出现问题。

如果有更多信息有帮助,请告诉我。我不知道是什么原因造成的,所以我不完全确定哪些信息可能有用。

编辑:这是两个对象设置和交互方式的简化版本。 CalendarViewController.m:

NSMutableArray *sectionHeaders;
@implementation CalendarViewController

-(id) initWithStyle:(UITableViewStyle)style 
    self = [super initWithStyle:style];
    sectionHeaders = [[NSMutableArray alloc] init];


//this is the method that adds items to the sectionHeaders object with irrelevant information excluded
-(void) distributeEvents 
    [self.tableView beginUpdates];
    if(condition1) 
        if(![sectionHeaders containsObject:@"Today"]) 
            [headers addObject:@"Today"];
        
    
    else if(condition2) 
        if(![sectionHeaders containsObject:@"Next week"]) 
            [headers addObject:@"Next week"];
        
    
    //et cetera...

//the only other time the sectionHeaders object comes up is in
- (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
    return sectionHeaders[section];

第二个对象 EventViewController 在点击单元格时被初始化。它不是使用与sectionHeaders 对象关联的任何变量创建的。

EventViewController.m:

NSArray *sectionHeaders;
@implementation EventViewController

//within the init method
sectionHeaders = @[@"What", @"When", @"Where"];

//later...
- (NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
    return sectionHeaders[section];

这就是我对这些对象的所有引用。对于问题中没有简化代码,我深表歉意。希望有更多的上下文会有所帮助。

【问题讨论】:

两个 UITableView 是否使用相同的委托?我最好的猜测是您的错误在委托代码中。 “请让我知道是否有更多信息会有所帮助”代码?没有代码,我们只能猜测。 @MikeZ 每个表视图都是它自己的委托 @JoshCaswell 我已经编辑了我的帖子,希望包含一个足够的例子 【参考方案1】:

从您的代码看来,两个 sectionHeaders 数组都定义在相应类的范围之外,并且基本上是两个同名的全局变量 - 在这种情况下,链接器应该给您一个警告。

我建议您将它们移到它们所属的班级中。

【讨论】:

以上是关于不同对象中具有相同名称的两个变量改变彼此的值的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能有两个具有相同功能的 goroutine 来查看彼此的值?

在具有相同名称的不同名称空间中招摇不同的类不起作用

如何在plsql中将对象类型属性的值分配给具有相同属性属性的不同对象类型?

类变量对于不同的实例具有不同的值[重复]

第三周学习总结

添加两个变量,其中包含来自同一数据库的两个不同表的值