NSMutableDictionary error - PullRequest
       3

NSMutableDictionary error

0 голосов
/ 05 сентября 2010

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

@interface MyData : NSObject {
    NSRange range;
    NSMutableArray *values;
}
@property (nonatomic, retain) NSMutableArray *values;

и реализует:

- (id)init {
    if (self = [super init]) {
        values = [[NSMutableArray alloc] init];
    }

    return self;
}

, и когда я хочу кешировать его, я использую его так:

NSMutableDictionary *cache = [[NSMutableDictionary alloc] init];
NSString *key = @"KEY";
MyData *data = [[MyData alloc] init];
// save some data into data
[data.values addObject:"DATA1"];
[data.values addObject:"DATA2"];
//... ...
[cache setObject:data forKey:key];

MyВопросы, счетчик cache.values ​​равен нулю, когда я получаю этот объект позже, как показано ниже:

[cache objectForKey:@"KEY"];

я могу получить «данные», и адрес памяти объекта совпадает с адресом, когда я помещаю его вкэш.в чем дело?Мне нужна помощь ребят, любая информация полезна.спасибо

Ответы [ 2 ]

0 голосов
/ 05 сентября 2010

Прежде всего ваши объекты, которые вы добавляете, выглядят неправильно, они должны иметь @ перед строкой.Например, @ "DATA1"

Во-вторых, когда вы добавляете объект в словарь или массив, он фактически не создает его копию.Он просто создает указатель на него, поэтому, если эти объекты уничтожаются или куда-то перемещаются, они также исчезают из вашего словаря.Лучший способ создать кэш ваших значений - скопировать объекты следующим образом:

MyData* cache = [[MyData alloc] init];

for (int i = 0; i < [data.values count]; i ++){{
    [cache.values addObject:[NSString stringWithString:[data.values objectAtIndex:i]]];
}

Не используйте словарь в этой ситуации.

0 голосов
/ 05 сентября 2010

Как указал Карл Норум, вы передаете строки C на addObject:. addObject:, как следует из его названия, требует указатель на объект Какао; строка C является указателем на символы. Вам нужно передать туда объекты NSString; для строковых литералов это просто требует поставить перед ними префикс @: "Fred" - это постоянная строка C, тогда как @"Fred" - это постоянный объект NSString.

Является ли cache переменной экземпляра? Похоже, это не так; кажется, что это локальная переменная, что означает, что вы каждый раз создаете новый объект словаря. Вот почему вы ничего не добавили ранее (в предыдущие словари) в новый. Это также означает, что вы пропускаете эти предыдущие словари, так как не выпускаете их (во всяком случае, не в показанном вами коде).

Сделать cache переменной экземпляра и создавать словарь, только если у вас его еще нет (т. Е. Когда cache == nil). Создание словаря в вашем методе init - хороший способ. И убедитесь, что вы правильно управляете временем его жизни , чтобы не допустить утечки и / или сбоя.

...