0

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

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

4

2 回答 2

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]]];
}

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

于 2010-09-05T14:34:28.230 回答
0

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

cache实例变量吗?看起来不是;它似乎是一个局部变量,这意味着您每次都在创建一个新的字典对象。这就是为什么您之前在新字典中没有添加任何内容(到以前的字典中)的原因。这也意味着您正在泄漏那些以前的字典,因为您没有发布它们(无论如何不在您显示的代码中)。

创建一个实例变量并仅在cache您还没有字典时(即 when cache == nil)创建字典。在您的方法中创建字典init是一种好方法。并确保您妥善管理其生命周期,以免泄漏和/或崩溃。

于 2010-09-05T04:07:38.677 回答