Утечка памяти из NSMutableArray и NSDictionary - PullRequest
0 голосов
/ 05 декабря 2010

У меня проблема с утечкой памяти, может быть, кто-нибудь может мне помочь. Я пытаюсь загрузить массив NSMutable для pList и показать некоторые элементы в TablevView

В h.File я объявляю

@interface Bestellung : UIViewController <UITableViewDelegate, UITableViewDelegate> {

NSMutableArray *bestellteVorspeisen;
NSMutableArray *bestellteVorspeisenPreis;
NSMutableArray *bestellteVorspeisenDetails;
NSMutableArray *bestellteVorspeisenBild;
NSMutableArray *bestellteVorspeisenNummer;

NSMutableArray *bestellListe;


IBOutlet UITableView *myTable; 


}
@property (nonatomic, retain) NSMutableArray *bestellListe;

@property (nonatomic,retain) NSMutableArray *bestellteVorspeisen;
@property (nonatomic,retain) NSMutableArray *bestellteVorspeisenPreis;
@property (nonatomic,retain) NSMutableArray *bestellteVorspeisenDetails;
@property (nonatomic,retain) NSMutableArray *bestellteVorspeisenBild;
@property (nonatomic,retain) NSMutableArray *bestellteVorspeisenNummer;

@end

В представлении M.FileDlLoad я загружаю pList в bestellListe

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"Bestellung.plist"];
    success = [fileManager fileExistsAtPath:filePath];
    if (!success) 
{       
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Bestellung" ofType:@"plist"];
        success = [fileManager copyItemAtPath:path toPath:filePath error:&error];
    }   
    self.bestellListe = [[NSMutableArray alloc] initWithContentsOfFile:filePath];

Затем я генерирую MutableArray

bestellteVorspeisen     = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenPreis        = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenDetails  = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenBild     = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenNummer   = [[NSMutableArray alloc] initWithCapacity:1]; 

После этого я заполняю их из bestellListe

for (NSDictionary *bestellDict in bestellListe) 
    {   if ([[bestellDict objectForKey:@"Tisch"] isEqualToString: 
[NSString stringWithFormat:@"%i",TischNummer]]) 
        {if ([[bestellDict objectForKey: kBestellungKategorieString] isEqualToString: @"Vorspeise"])  
            [bestellteVorspeisen            addObject: [bestellDict objectForKey:kBestellungNameString]]; 
                [bestellteVorspeisenPreis       addObject: [bestellDict objectForKey:kBestellungPreisString]]; 
                [bestellteVorspeisenDetails     addObject: [bestellDict objectForKey:kBestellungDetailString]]; 
                [bestellteVorspeisenBild        addObject: [bestellDict objectForKey:kBestellungBildString]];
                [bestellteVorspeisenNummer      addObject: [bestellDict objectForKey:kBestellungNummer]];
} // if
} // if
} // for

Это вызывает утечки памяти на

self.bestellListe = [[NSMutableArray alloc] initWithContentsOfFile:filePath];

и

bestellteVorspeisen     = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenPreis        = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenDetails  = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenBild     = [[NSMutableArray alloc] initWithCapacity:1]; 
bestellteVorspeisenNummer   = [[NSMutableArray alloc] initWithCapacity:1];

Здесь есть сделка

- (void)dealloc {

NSLog(@"Bestellung dealloziert");

[bestellteVorspeisen            release];
[bestellteVorspeisenPreis       release];
[bestellteVorspeisenDetails     release];
[bestellteVorspeisenBild        release];
[bestellteVorspeisenNummer      release];

[bestellListe                   release];
[myTable                        release];

[super dealloc];

Может кто-нибудь помочь мне, я действительно новичок в этом.

1 Ответ

5 голосов
/ 05 декабря 2010

Ваш синтезированный метод автоматически сохраняет полученные объекты:

@property (nonatomic, retain) NSMutableArray *bestellListe;

Поэтому, когда вы делаете:

self.bestellListe = [[NSMutableArray alloc] initWithContentsOfFile:filePath];

Ваш bestellListe имеет счет сохранения 2 (alloc + retain fromсвойство).

На вашем dealloc вы отпускаете его только один раз:

[bestellListe release];

Кажется, что более простое решение сохраняет его только один раз при его создании, с автоматически выпущенным инициализатором, например:

self.bestellListe = [NSMutableArray arrayWithContentsOfFile:filePath];

Надеюсь, это поможет

...