我想使用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"];我可以检索"data“,并且对象的内存地址与我将其放入缓存时的地址相同。怎么了?我需要一些好心人的帮助,任何信息都有帮助。谢谢
发布于 2010-09-05 12:07:39
正如Carl Norum所指出的,您正在将C字符串传递给addObject:。顾名思义,addObject:需要指向Cocoa对象的指针;C字符串是指向字符的指针。您需要在那里传递NSString对象;对于文字字符串,这只需要在它们前面加上@:"Fred"是一个常量C字符串,而@"Fred"是一个常量NSString对象。
cache是实例变量吗?它看起来不是;它似乎是一个局部变量,这意味着您每次都要创建一个新的字典对象。这就是为什么在新的字典中没有添加任何东西(在以前的字典中)。这也意味着你正在泄露以前的字典,因为你没有发布它们(无论如何,不是在你展示的代码中)。
将cache设置为实例变量,并且仅当您还没有字典时(即,当cache == nil时)才创建字典。在init方法中创建字典是一种很好的方法。并确保你的manage its lifetime appropriately,这样你就不会泄漏和/或崩溃。
发布于 2010-09-05 22:34:28
首先,你添加的对象看起来不对,在字符串前应该有一个@。就像@"DATA1“
其次,当您将一个对象添加到字典或数组中时,它并不会创建它的实际副本。它只是创建了一个指向它的指针,所以如果这些对象被销毁或移动到某个地方,它们也会从你的字典中消失。对值进行缓存的更好方法是复制对象,如下所示:
MyData* cache = [[MyData alloc] init];
for (int i = 0; i < [data.values count]; i ++){{
[cache.values addObject:[NSString stringWithString:[data.values objectAtIndex:i]]];
}在这种情况下,不要使用字典。
https://stackoverflow.com/questions/3644822
复制相似问题