Ошибки памяти при попытке создать и заполнить NSMutableDictionary - PullRequest
0 голосов
/ 06 февраля 2011

Я не являюсь разработчиком Какао, но я пытался создать несколько плагинов для 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 ]

2 голосов
/ 06 февраля 2011

Из вашего кода следует, что вы «владеете» объектами values и jsString (те, которые вы создали с помощью alloc), поэтому вы должны освобождать их, а не другие.по управлению памятью здесь .

Это весь код?Кроме того, какую именно ошибку вы получаете?

1 голос
/ 06 февраля 2011

Никита прав, похоже, что вы переиздаваете defaults, что может вызвать сбой позже, когда пул авто-релиза будет выпущен. Кроме того, если я понимаю, что вы пытаетесь сделать правильно, вы можете создать словарь values с одной строкой кода:

NSDictionary *values = [defaultsDict dictionaryWithValuesForKeys:keys];
...