【问题标题】:Pointer to a Pointer in Objective-C指向 Objective-C 中的指针的指针
【发布时间】:2011-05-19 21:03:29
【问题描述】:

我有一个带有一些值的 NSDictionary。通常,NSDictionary 中的值是静态的,但在极少数情况下(用户更改设置),NSDictionary 会更改。 字典在应用程序范围内使用并存储在应用程序委托中。

我现在遇到的问题:当设置改变时,我释放旧字典并创建一个新字典。我现在如何通知所有相关方?我想存储 NSDictionary** 指针并根据需要尊重它们,以获得 NSDictionary* (从来没有释放字典而不重新创建的情况)。

NSMutableDictionary* dict = [NSMutableDictionary alloc] init];
...
NSDictionary** ref = &dict;

当我运行调试器时,我可以看到取消引用 ref 确实让我最初得到了 dict。但是一段时间后,似乎 ref 指向了必杀技。想知道我是否需要管理内存或某事。对于 NSDictionary **?由于它不是指向对象的指针,因此保留它没有意义。但这似乎是内存问题?

【问题讨论】:

    标签: iphone objective-c memory ios


    【解决方案1】:

    我不会评论指针的复杂性,因为这与这种情况无关。此外,我不确定您想要什么,但我认为您正在寻找一种方法来观察一个对象在另一个对象中的变化。好消息是 Cocoa 提供了开箱即用的功能。

    因此,您需要将此字典作为某物(您的应用程序委托)的属性。然后,在任何关心的对象中使用 key-value-observing 来观察该属性的变化:

    [appDelegate addObserver:self forKeyPath:@"dictPropertyName"];
    

    然后,实现-observeValueForKeyPath:ofObject:change:context:

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if ([keyPath isEqualToString:@"dictPropertyName"]) {
            // your property has changed; respond to that here
        }
    }
    

    如果这和你想要的一样,请告诉我。

    【讨论】:

    • 伙计们,请参阅@bbum 的回答。他的想法是改用NSNotificiationCenter,当你有很多观察者关心这个对象的变化时,这肯定会简化这一点。
    【解决方案2】:

    乔纳森的回答是正确的。但是,由于这是一种全球性的事情,因此简单地使用通知让所有相关方都知道字典已更改可能更有意义或更有意义。

    具体见NSNotificationCenter and NSNotification

    【讨论】:

    • 我同意这是解决该问题的一个更常见的解决方案 - KVC 在很多情况下都很好,但对于像整个数组发生变化的情况,使用任何人都可以收听的通知可能更简单为。
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多