【问题标题】:Memory errors when trying to create and populate a NSMutableDictionary尝试创建和填充 NSMutableDictionary 时出现内存错误
【发布时间】:2011-02-06 19:16:49
【问题描述】:

我不是 Cocoa 开发人员,但我一直在尝试为 PhoneGap 构建一些插件。这个特定的插件方法是 1) 使应用程序崩溃而不说明原因或 2) 抱怨我如何释放/不释放对象。我已经尝试了很多东西,包括使用枚举器而不是 for 循环。如果有人能指出我正确的方向,那就太棒了。我不介意跑腿:

- (void)getPreferences:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options {
    NSUInteger argc = [arguments count];
    NSString* jsCallback = nil;

    if (argc > 0) {
        jsCallback = [arguments objectAtIndex:0];
    } else {
        NSLog(@"Preferences.getPreferences: Missing 1st parameter.");
        return;
    }

    NSDictionary *defaults = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
    NSMutableArray *keys = (NSMutableArray *) [options objectForKey:@"keys"];
    NSMutableDictionary *values = [[NSMutableDictionary alloc] init];

    NSUInteger ky = [keys count];
    for (int i = 0; i < ky; i ++) {
        @try {

            [values  setObject:[defaults objectForKey:[keys objectAtIndex:i]] forKey:[keys objectAtIndex:i]];
        }
        @catch (NSException * err) {
            NSLog(@"Error %@", err);
        }
    }

    [keys release];

    NSString* jsString = [[NSString alloc] initWithFormat:@"%@(%@);", jsCallback, [values JSONRepresentation]];

    [defaults release];
    [values release];

    [webView stringByEvaluatingJavaScriptFromString:jsString];

    [jsString release];
}

人类版:

  1. options 包含一个带有“keys”键的字典
  2. 该键包含一个字符串数组(将用作查找键)
  3. 我想遍历那个数组
  4. 对于存在于defaults 中的每个值,使用相同的键将其复制到values
  5. 最后,我想将 values 作为 JSON 发送回(当我刚刚将整个 defaults 对象传入时,这部分正在工作,所以我认为 JSON 方法正在工作)

【问题讨论】:

  • 很抱歉用一些完全题外话来打扰您,但是您是否碰巧在 downloadify 网站上有新闻?哪里有镜子?我有许多帖子指向它,并对其进行了编辑以链接到您的 github 个人资料。那是目前最好的位置吗?
  • @Pekka,是的,暂时。新家可能位于 labs.dougneiner.com/downloadify。我觉得自己不更新名字就像个白痴……当我这样做的时候,已经晚了几天。 #失败

标签: objective-c ios memory-management nsmutabledictionary


【解决方案1】:

根据您的代码,您“拥有”对象valuesjsString(您使用alloc 创建的对象),因此您应该释放它们而不是任何其他对象。
你可以阅读更多关于内存管理的内容here

这是整个代码吗?另外,你到底得到了什么错误?

【讨论】:

  • +1 哇,删除另外两个发布调用修复了它。此外,拥有它的概念对我来说很有意义。感谢您这么快的回复!
  • @Doug 我添加的链接应该有助于理解一般概念:它很短,但很清楚。祝你好运:)
【解决方案2】:

Nikita 是对的,看起来好像您过度释放了defaults,这会在稍后释放自动释放池时导致崩溃。另外,如果我理解您要正确执行的操作,您可以使用一行代码创建 values 字典:

NSDictionary *values = [defaultsDict dictionaryWithValuesForKeys:keys];

【讨论】:

  • 是的,这正是我想要的。哇,这比我想象的要容易得多。谢谢! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多