2015-03-12 3 views
0

Я пытаюсь добавить ключи в dictionnary в Objective-C. Код выглядит следующим образом:Содержимое NSMutableDictionnary беспорядочно возвращено

У меня есть класс MyClass, заголовок файла содержит:

@property (nonatomic) NSMutableDictionary *dict; 

Это инициализируется следующим образом:

_dict = [[NSMutableDictionary alloc] init]; 

Затем я пытаюсь добавить ключи к нему:

- (void) addOrModify:(myKey*) key withValue:(myValue *) value { 
[self.dict setObject:value forKey:key]; 
NSLog(@"Adding the key %@ %p with value %@ %p",[key description],key,[value description],value); 
NSLog(@"%@",[self.dict description]); 
} 

И вот что я могу получить при добавлении разных ключей/значений:

Adding the key (key1) 0x7f9dc3590070 with value (value1) 0x7f9dc358e760 
{ 
"(key1)" = "(value1)"; 
} 

Adding the key (key2) 0x7f9dc357adc0 with value (value2) 0x7f9dc357de20 
{ 
"(key2)" = (null); 
"(key1)" = "(value1)"; 
} 

Adding the key (key3) 0x7fa4d2cbdbd0 with value (value3) 0x7fa4d2d53cf0 
{ 
"(key3)" = "(value3)"; 
"(key2)" = "(value2)"; 
"(key1)" = "(value1)"; 
} 

Теперь, если я взгляну на фактическое содержание словаря с помощью отладчика XCode, я обнаружил, что все пары key/value присутствуют как следует. Таким образом, кажется, что метод описания dict не позволяет правильно напечатать значение некоторых ключей. То же самое происходит без использования NSLog, но отображается содержимое словаря в UITable. Также обратите внимание, что если я попытаюсь записать адрес значения для этих конкретных ключей, он также даст мне 0x0 (поэтому моя функция описания не виновата).

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

Edit 1

Интерфейс моих ключей

@interface myKey : NSObject <NSCopying> 
@property(nonatomic, copy) NSString *myKeyName; 
@property(nonatomic) float myKeyFloat; 
@property(nonatomic, readonly, strong) NSDate *dateCreated; 

Интерфейс моих значений:

typedef NS_ENUM(NSInteger, Unities) { g, kg, }; 
@interface myValue : NSObject 
@property(nonatomic) float myValueFloat; 
@property(nonatomic) Unities myValueUnit; 

телефонный код

- (IBAction)addKeyValue:(id)sender { 
myValue *value = [myValue randomValue]; 
myKey *key =[[CatalogKeys sharedCatalogKeys] 
getRandomKeyFromStore]; [self.dict addOrModify:key withValue: value]; 
} 

, где randomValue просто установить myValueUnit к «г» и помещает случайный поплавок в myValueFloat

+0

Это поможет людям, чтобы помочь вам, если вы добавите определения типов '' myKey' и myValue' вдоль по крайней мере, с кодом, который вызывает 'addOrModify' на ваш вопрос. – CRD

+0

Я также пытался сыграть с моим кодом, но не смог найти окончательного решения этой проблемы.Единственное, что я нашел, это то, что если я добавлю [ключевое описание] вместо ключа в словарь, проблема исчезнет. Затем я уменьшил класс myKey, чтобы содержать только NSString, но затем снова появляется проблема. Что меня больше всего расстраивает, так это несоответствие между тем, что NSLog печатает и что я вижу в отладчике ... – vib

ответ

1

Это предположение:

Информация, не показывает, что ваш тип myKey реализует isEqual: и hash. Ключи должны применять эти методы для правильной работы в NSDictionary; если они не реализованы, будут использоваться варианты по умолчанию NSObject, и они, вероятно, не приведут к правильным результатам для экземпляров myKey.

Вы также показывают, что с помощью description ваших myKey случаях делает работу, это имеет смысл, поскольку description возвращает NSString и тип реализует isEqual: и hash.

НТН

+0

Отлично! Я реализовал хэш-функцию (просто хеширование по keyName), и это сработало отлично! Большое спасибо. Кстати: я ошибаюсь или документация NSDictionnary не указывает это ограничение определения хэша? – vib

+0

Ну, 'NSDictionary' утверждает, что он использует' isEqual: ', и если посмотреть, что его определение гласит: * Если два объекта равны, они должны иметь одно и то же значение хэша. Этот последний пункт особенно важен, если вы определяете isEqual: в подкласс и намерены поместить экземпляры этого подкласса в коллекцию. Убедитесь, что вы также определяете хэш в своем подклассе. * «Так оно есть, но не прямо в документах NSDictionary. – CRD

Смежные вопросы