Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 指向Objective-C中的指针的指针_Iphone_Objective C_Memory_Ios - Fatal编程技术网

Iphone 指向Objective-C中的指针的指针

Iphone 指向Objective-C中的指针的指针,iphone,objective-c,memory,ios,Iphone,Objective C,Memory,Ios,我有一本带有一些值的词典。通常,NSDictionary中的值是静态的,但在少数情况下(用户更改设置),NSDictionary会更改。 字典在应用程序范围内使用,并存储在应用程序委托中 我现在遇到的问题是:当设置更改时,我会释放旧词典并创建一个新词典。我现在如何通知所有相关方?我想存储NSDictionary**指针,并根据需要执行它们,以便获得NSDictionary*(从来没有一种情况下字典会被发布而不会被重新创建) 当我运行调试器时,我可以看到,取消引用ref确实会使我最初得到dict。

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

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


当我运行调试器时,我可以看到,取消引用ref确实会使我最初得到dict。但过了一段时间,ref似乎指向了涅盘。想知道我是否需要管理NSDictionary**的内存或其他内容?因为它不是指向对象的指针,所以保留它是没有意义的。但这看起来确实像是内存问题?

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

因此,您需要将此字典作为某个对象(您的应用程序委托)的属性。然后,在任何对象中使用键值来观察该属性的更改:

[appDelegate addObserver:self forKeyPath:@"dictPropertyName"];
然后,实现对象的observeValueForKeyPath: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
    }
}

如果这是你想要的,请告诉我。

乔纳森的回答是正确的。然而,由于这是一种全局性的事情,因此只需使用一个通知让所有相关方都知道字典已经更改,这可能会更有意义


具体来说,请参见。

我同意这是解决该问题的一个更常见的解决方案-KVC在很多情况下都很好,但对于整个阵列的更改,只使用任何人都可以侦听的通知可能更简单。各位,请参见@bbum的答案。他的想法是使用
nsnotificationcenter
,当您有许多观察者关心此对象的更改时,这肯定会简化此过程。
- (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
    }
}