NSMUtableDictionary проблема освобождения - PullRequest
0 голосов
/ 04 июня 2010

У меня есть два метода в разных классах.Один из них - метод класса, а другой - метод экземпляра.я вызываю метод класса из метода экземпляра.Когда метод экземпляра завершается, он выдает ошибку времени выполнения «EXC_BAD_ACCESS».

#import "xmlObject.h"
#import "textmeAppDelegate.h"

@implementation Class1 
    - (void)method1 {
        textmeAppDelegate *del = (textmeAppDelegate *)[[UIApplication sharedApplication] delegate];

        NSArray *bgColor = [[NSArray alloc] initWithArray:[xmlObject fetchImmediateChildrenValues:[del.navigationbarStyle objectForKey:@"backgroundcolor"]]];
        UIColor *color = [UIColor colorWithRed:[[bgColor objectAtIndex:3] floatValue] green:[[bgColor objectAtIndex:2] floatValue] blue:[[bgColor objectAtIndex:1] floatValue] alpha:[[bgColor objectAtIndex:0] floatValue]];
        CGContextSetFillColor(context, CGColorGetComponents([color CGColor]));
        CGContextFillRect(context, rect);
        [bgColor release];

    }
@end

@implementation xmlObject 
    + (NSArray *) fetchImmediateChildrenValues:(NSMutableDictionary *) node {
         NSMutableDictionary *tmp = [[node objectForKey:@"children"] retain];
         NSArray *keys = [[NSArray alloc] initWithArray:[tmp allKeys]];
         keys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
         NSMutableArray *pushArr = [[[NSMutableArray alloc] init] autorelease];
         NSString *val = [[NSString alloc] init];
         for(NSString *str in keys) {
            val = (NSString *)[[tmp objectForKey:str] objectForKey:@"innertext"];
            [pushArr addObject:val];
         }
         [val release];
         [keys release];

         return  [NSArray arrayWithArray:pushArr];
     }          
@end

Что не так с кодом?Также приложение аварийно завершает работу для этой строки кода. Приложение завершается аварийно, если я включаю эту строку

NSArray *bgColor = [[NSArray alloc] initWithArray:[xmlObject fetchImmediateChildrenValues:[del.navigationbarStyle objectForKey:@"backgroundcolor"]]];

Если я удаляю его, приложение работает гладко.

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Вы отпускаете объекты, когда не должны быть.

В fetchImmediateChildrenValues ​​вы выпускаете val, но это не тот же val, который вы выделили, это val, возвращаемый внутри цикла for. Удалите alloc и отпустите для val.

///NSString *val = ...
for(NSString *str in keys) {
    NSString* val = (NSString *)[[tmp objectForKey:str] objectForKey:@"innertext"];
    [pushArr addObject:val];
}
///[val release];

Вы делаете ту же ошибку с ключами. Вы инициализируете ключи для чего-то, что у вас есть (вы выделяете это), затем вы заменяете это (что приводит к утечке памяти) чем-то, что вам не принадлежит (это авто-релиз), затем вы отпускаете ключи, которые освобождают автоматически выпущенный объект. Таким образом, вы перепустите его.

Прочитайте правила управления памятью еще раз. См. здесь и здесь .

0 голосов
/ 04 июня 2010

Я считаю, что проблема связана с

keys = [keys sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

в описании sortedArrayUsingSelector говорится, что он возвращает ссылки на исходный массив, однако вы фактически перезаписываете это с помощью присваивания. Чтобы быть в безопасности, назначьте вместо этого новую переменную (и избежите утечки памяти)

...