NSMutableDictionary错误

时间:2010-09-05 02:54:48

标签: objective-c cocoa nsmutabledictionary

我想使用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];

我的问题是当我稍后检索此对象时,cache.values的数量为零:

[cache objectForKey:@"KEY"];

我可以检索“数据”,并且对象的内存地址与我将其放入缓存时的地址相同。 怎么了?我需要一些善良的帮助,任何信息都有帮助。感谢

2 个答案:

答案 0 :(得分:0)

正如Carl Norum指出的那样,你将C字符串传递给addObject:addObject:,顾名思义,需要一个指向Cocoa对象的指针; C字符串是指向字符的指针。你需要在那里传递NSString对象;对于文字字符串,这只需要为它们添加前缀@"Fred"是一个常量C字符串,而@"Fred"是一个常量NSString对象。

cache是实例变量吗?它看起来不是;它似乎是一个局部变量,这意味着你每次都要创建一个新的字典对象。这就是为什么你之前没有添加任何东西(以前的词典)。这也意味着你正在泄露那些以前的词典,因为你没有发布它们(不管你所展示的代码中是什么)。

使cache成为一个实例变量,只在你还没有一个字典时才创建它(即cache == nil时)。在init方法中创建字典是一种好方法。并确保你manage its lifetime appropriately,这样你就不会泄漏和/或崩溃。

答案 1 :(得分:0)

首先你的对象你的添加看起来不正确它应该在字符串之前有一个@。喜欢@“DATA1”

第二,当您将对象添加到字典或数组时,它不会创建它的实际副本。它只是创建一个指向它的指针,所以如果这些对象被破坏或移动到某个地方,它们也会从你的字典中消失。制作值的缓存的更好方法是复制对象,如下所示:

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

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

在这种情况下不要使用字典。