我想使用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"];
我可以检索“数据”,并且对象的内存地址与我将其放入缓存时的地址相同。 怎么了?我需要一些善良的帮助,任何信息都有帮助。感谢
答案 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]]];
}
在这种情况下不要使用字典。