首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSMutableDictionary错误

NSMutableDictionary错误
EN

Stack Overflow用户
提问于 2010-09-05 10:54:48
回答 2查看 380关注 0票数 0

我想使用NSMutableDictionary缓存一些稍后会用到的数据。我的自定义对象如下:

代码语言:javascript
复制
@interface MyData : NSObject {
    NSRange range;
    NSMutableArray *values;
}
@property (nonatomic, retain) NSMutableArray *values;

并实现:

代码语言:javascript
复制
- (id)init {
    if (self = [super init]) {
        values = [[NSMutableArray alloc] init];
    }

    return self;
}

当我想缓存它的时候,我会这样使用它:

代码语言:javascript
复制
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的计数为零,如下所示:

代码语言:javascript
复制
[cache objectForKey:@"KEY"];

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

EN

回答 2

Stack Overflow用户

发布于 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,这样你就不会泄漏和/或崩溃。

票数 0
EN

Stack Overflow用户

发布于 2010-09-05 22:34:28

首先,你添加的对象看起来不对,在字符串前应该有一个@。就像@"DATA1“

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

代码语言:javascript
复制
MyData* cache = [[MyData alloc] init];

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3644822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档