尝试创建和填充NSMutableDictionary时出现内存错误

时间:2011-02-06 19:16:49

标签: objective-c ios memory-management nsmutabledictionary

我不是Cocoa开发人员,但我一直在尝试为PhoneGap构建一些插件。这个特殊的插件方法是1)崩溃应用程序而不说明为什么或2)抱怨我如何释放/不释放对象。我已经尝试了很多东西,包括使用Enumerator而不是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方法正常工作)

2 个答案:

答案 0 :(得分:2)

在您的代码中,您拥有'对象valuesjsString(您使用alloc创建的对象),因此您应该释放它们,而不是其他任何对象。<登记/> 您可以阅读有关内存管理here的更多信息。

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

答案 1 :(得分:1)

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

NSDictionary *values = [defaultsDict dictionaryWithValuesForKeys:keys];