【问题标题】:Keep NSDictionary value updated with its underlying object value使用其底层对象值保持 NSDictionary 值更新
【发布时间】:2015-03-18 23:23:45
【问题描述】:

编辑:真实情况

MyAppDelegate 拥有以下资源:

@property (nonatomic, strong) NSDictionary *page1;
@property (nonatomic, strong) NSDictionary *page2;
@property (nonatomic, strong) NSDictionary *page3;

这是我初始化它们时的样子:

self.page1 = @{@"videoPath":myPath, @"leftText":self.buttonTitle1, @"menuButtons":@[page2,page3]};
self.page2 = @{@"videoPath":myPath, @"leftText":@"long text", @"menuButtons":@[page1,page3]};
self.page3 = @{@"videoPath":myPath, @"leftText":@"another text", @"menuButtons":@[page1,page2]};

所以每个 menuButtons 键都包含对其他对象的引用。

举个例子:在某个时刻,用户编辑了 buttonTitle1 变量,写入了一个新文本(例如:“我的新按钮标题”)。 我希望其他字典(page2page3)能反映这种修改,所以检查 page2[@"menuButtons"] 会给我一个“我的新按钮标题”(page1 的 leftText 键)和“另一个文本”(page3 的 leftText 键)的 NSArray。

考虑到大约有 100 个页面,用户可以多次编辑 buttonTitle1

我怎样才能让我的字典保持更新?


原始-未详细-问题:

给定一个带有键和值的 NSDictionary,我想保持 NSDictionary 的内容更新,所以当有人在 NSDictionary 之外编辑值时,它会反映该修改。 我不知道怎么用英文解释,所以请举个例子:

NSNumber *number = [NSNumber numberWithInt:1];
NSDictionary *dict = @{@"test":number};
NSLog(@"%@", dict); // print "test = 1"
number = [NSNumber numberWithInt:2];
NSLog(@"%@", dict); // print "test = 1" but I'd expect "test = 2"

我知道 NSDictionary 获取对象的副本,那么是否有任何其他组件或解决方法来完成此操作?

请注意,我已经尝试过使用 NSMutableDictionary 和 NSMapTable,但没有成功。

【问题讨论】:

    标签: ios objective-c nsdictionary


    【解决方案1】:

    NSDictionary 不获取对象的副本,而是获取密钥的副本。

    您所做的是更改与字典无关的指针,因此字典不知道它已更改。你不能真正让字典知道。

    你可以做的是把一个可变对象放入字典,然后改变它的内部状态。如果你需要,一个包装类会做。

    例如,如果您将可变字典放入字典,然后更改可变字典的内容(但不是指向可变字典的指针,请注意这里)并记录字典,您将看到生成的日志输出更改。

    【讨论】:

    • 如何更改可变字典而不是指针?使用[NSDictionary setObject:forKey:] ??当我需要更新可变字典时,我不知道可变字典所在的“父”字典...
    • 重点是你改变了字典中的对象,你的例子在哪里改变了字典之外的东西
    • 是的,我当然想在字典之外更改一些东西,并在字典中有一个指向该对象的指针,所以它总是会更新。也许我必须离开 NSDictionary 并使用其他东西......
    • 你需要改变对象,而不是改变指针,所以是的,就像调用 setObject:forKey: 而不是设置 =。字典不是问题,你要改变的是。
    • 好的,我明白了。但考虑一下,如果我的示例中的数字在 100 个字典之内,我必须使用 setObject:forKey: 更新所有字典 ... ??!我希望必须有另一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多