2013-10-14 4 views
0

У меня есть следующие свойства:NSDictionary: Сравнение после MutableCopy

@property (retain, nonatomic) NSMutableDictionary * firstStartTimeObject; 
@property (retain, nonatomic) NSMutableDictionary * firstLocationNameObject; 
@property (retain, nonatomic) NSMutableDictionary * firstLocationAddressObject; 

@property (retain, nonatomic) NSMutableDictionary * secondStartTimeObject; 
@property (retain, nonatomic) NSMutableDictionary * secondLocationNameObject; 
@property (retain, nonatomic) NSMutableDictionary * secondLocationAddressObject; 

// Это как я делаю копию словарей:

-(DataClass *)copyObjects 
{ 
    DataClass *newClass = [[DataClass alloc]init]; 
    newClass.firstStartTimeObject = [firstStartTimeObject mutableCopy]; 
    newClass.firstLocationAddressObject = [firstLocationAddressObject mutableCopy]; 
    newClass.firstLocationNameObject = [firstLocationNameObject mutableCopy]; 
    newClass.secondStartTimeObject = [secondStartTimeObject mutableCopy]; 
    newClass.secondLocationNameObject = [secondLocationNameObject mutableCopy]; 
    newClass.secondLocationAddressObject = [secondLocationAddressObject mutableCopy]; 

    return newClass; 
} 

// В другом классе я сравниваю их

if([myClass.firstStartTimeObject isEqualToDictionary:dataClass.firstStartTimeObject]) 
{ 
    [dataClass.firstStartTimeObject setValue:kCellBackGroundColor forKey:kBackGround]; 
} 

if([myClass.firstLocationNameObject isEqualToDictionary:dataClass.firstLocationNameObject]) 
{ 
    [dataClass.firstLocationNameObject setValue:kCellBackGroundColor forKey:kBackGround]; 
} 

if([dataClass.firstLocationAddressObject isEqualToDictionary:dataClass.firstLocationAddressObject]) 
{ 
    [dataClass.firstLocationAddressObject setValue:kCellBackGroundColor forKey:kBackGround]; 
} 

if([myClass.secondStartTimeObject isEqualToDictionary:dataClass.secondStartTimeObject]) 
{ 
    [dataClass.secondStartTimeObject setValue:kCellBackGroundColor forKey:kBackGround]; 
} 

if([myClass.secondLocationNameObject isEqualToDictionary:dataClass.secondLocationNameObject]) 
{ 
    [dataClass.secondLocationNameObject setValue:kCellBackGroundColor forKey:kBackGround]; 
} 

if([myClass.secondLocationAddressObject isEqualToDictionary:dataClass.secondLocationAddressObject]) 
{ 
    [dataClass.secondLocationAddressObject setValue:kCellBackGroundColor forKey:kBackGround]; 
} 

У меня есть точка останова. Ключи/Значения при сравнении словарей идентичны, но похоже, что компилятор смотрит на них по-другому, поскольку условие никогда не выполняется для того, чтобы оно попало в фигурные скобки и попало в точку останова.

Я проверял ключи/значения через NSLog, и они идентичны. Я даже пробовал протокол с - (id)mutableCopyWithZone:(NSZone *)zone и получил то же поведение.

Может ли mutableCopy из NSMutableDicitonary изменить свою копию на то, где без изменения какого-либо ее содержимого вы сравниваете ее с исходным кодом, и это не то же самое? Я не могу понять, что я делаю неправильно!

+0

if ([dataClass.firstLocationAddressObject isEqualToDictionary: dataClass.firstLocationAddressObject]) почему это условие вы сравниваете как это? –

+0

Что это значит? Мне нужно сравнить словари, чтобы узнать, изменилось ли какое-либо из значений для ключей. – user1107173

+0

Нет, я имею в виду, что вы сравниваете свое состояние как для данных, так и для одного класса –

ответ

1

Два словаря имеют одинаковое содержание, если каждый из них имеет одинаковое количество записей, а для данного ключа соответствующие объекты значений в каждом словаре удовлетворяют критерию isEqual:. Вот как работает equaltodictionary. Так как проблема выглядит так, ваше содержимое не содержит одинаковое количество записей. Повторите проверку своего объекта с мутацией. И еще одна вещь, которую я заметил, - это то, что ваш, если вы сравниваете один и тот же dataclass, несмотря на наличие одного myclass.

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