проблема памяти в сложном словаре - PullRequest
1 голос
/ 03 августа 2010

Я ненавижу задавать вопросы по управлению памятью - все хорошие ответы Это вариации RTFM. Но этот одурачивает меня.

У меня есть (относительно) сложный словарь в моём модельном классе, где каждый ключ указывает на массив массивов. Я постоянно добавляю и удаляю предметы к нему, в зависимости от состояния. Каждый «элемент» является массивом.

- (void)addToDictionary:(NSNumber *)itemID {

        // get what we need (associated array of arrays & key) from the incoming ID
        NSArray *incomingArray = [self getArrayFromID:[itemID intValue]];
        NSString *myKey = [incomingArray objectAtIndex:0];

        NSMutableArray *myNewArray = [[NSMutableArray alloc] init];

        // case 1: this key is not in the dictionary yet
        if ([[myDict allKeys] containsObject:myKey] == NO) {
            [myNewArray addObject:incomingArray];
            [myDict setObject:myNewArray forKey:myKey];

        // case 2: key already there; add new array to its array
        } else {
            myNewArray = [NSMutableArray arrayWithArray:[myDict objectForKey:myKey]];
            [myNewArray addObject:incomingArray];
            [myDict removeObjectForKey:myKey];
            [myDict setObject:myNewArray forKey:myKey];
        }
        // why isn't this line working??
        [myNewArray release];
}

Мой вопрос - последняя строка. Я выделил этот массив, чтобы помочь мне работать со словарем, и теперь он мне больше не нужен. Но программа вылетит, если я ее отпущу, и будет работать нормально если я прокомментирую эту строку. Что мне не хватает? ТИА

1 Ответ

1 голос
/ 03 августа 2010

В случае два вы не являетесь владельцем возвращаемого массива. Так что выпустите его только в случае 1. И не создавайте то, что вы не будете использовать. Указатель NSMutableArray будет назначен некоторым другим данным в случае 2, а не тому, который вы выделили. Таким образом, вы не можете выпустить то, чем не владеете.

- (void)addToDictionary:(NSNumber *)itemID {
    NSArray *incomingArray = [self getArrayFromID:[itemID intValue]];
    NSString *myKey = [incomingArray objectAtIndex:0];

    NSMutableArray *myNewArray;

    if ([[myDict allKeys] containsObject:myKey] == NO) {
        // Create when you need it
        myNewArray = [[NSMutableArray alloc] init];
        [myNewArray addObject:incomingArray];
        [myDict setObject:myNewArray forKey:myKey];

        // release when you're done with it
        [myNewArray release];

    } else {
        myNewArray = [NSMutableArray arrayWithArray:[myDict objectForKey:myKey]]; // you don't own it!
        [myNewArray addObject:incomingArray];
        [myDict removeObjectForKey:myKey];
        [myDict setObject:myNewArray forKey:myKey];
    }
    // why isn't this line working??
    //[myNewArray release];
    // because in case 2 it's not pointing to the right memory
}

Надеюсь, это сработает, ief2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...