2010-12-03 3 views
0

У меня есть NSDictionary с некоторыми значениями. Обычно значения в NSDictionary статичны, но в некоторых редких случаях (настройки пользовательских настроек) изменяется NSDictionary. Словарь широко используется в приложении и сохраняется в делегате приложения.Указатель на указатель в Objective-C

Проблема, которая возникает у меня сейчас: при изменении настроек я выпускаю старый словарь и создаю новый. Как мне теперь сообщить всем заинтересованным сторонам? Я думал о сохранении указателей NSDictionary ** и уважать их, как мне нужно, для получения NSDictionary * (никогда не бывает, когда словарь освобождается и не воссоздается).

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

Когда я запускаю отладчик, я вижу, что исправление разыменования действительно меня изначально требует. Но через какое-то время кажется, что ref указывает на нирвану. Интересно, нужно ли мне управлять памятью или sth. для NSDictionary **? Так как это не указатель на объект, сохранение его не имеет смысла. Но это похоже на проблему с памятью?

ответ

4

Я не буду комментировать сложность указателей, потому что это действительно не имеет отношения к этой ситуации. Кроме того, я не совсем уверен, что вы хотите, но я думаю, что вы ищете способ наблюдать изменения от одного объекта в другом. Самое приятное, что Cocoa предоставляет это из коробки.

Итак, вам нужно, чтобы этот словарь был чем-то иным (делегатом приложения). Затем, используя ключ-значение-наблюдения в зависимости от того, объекты обслуживания, чтобы наблюдать, что свойство изменения:

[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 
    } 
} 

Позвольте мне знать, если это что-то вроде того, что вы хотите ,

+0

Люди, пожалуйста, см. Ответ @ bbum. Его идея состоит в том, чтобы вместо этого использовать `NSNotificiationCenter`, что, безусловно, упростит это, когда у вас будет много наблюдателей, которые заботятся об изменениях в этом объекте. – 2010-12-03 21:00:56

4

Ответ Джонатана верен. Однако, поскольку это глобальная вещь, она может сделать так же или более простое использование уведомления, чтобы все заинтересованные стороны знали, что словарь изменился.

В частности, см. NSNotificationCenter and NSNotification.

+1

Я согласен, что это более распространенное решение этой проблемы - KVC хорош во многих случаях, но для чего-то вроде изменения целого массива, вероятно, проще просто использовать уведомление, которое любой может слушать. – 2010-12-03 17:29:33