2010-12-05 1 views
0

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

В 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.File viewDidLoad я загружаю 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 

Это вызывает memoryleaks на

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]; 

Здесь IST dealloc

- (void)dealloc { 

NSLog(@"Bestellung dealloziert"); 

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

[bestellListe     release]; 
[myTable      release]; 

[super dealloc]; 

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

+0

Вы можете редактировать и помещать весь код в форматированные кодовые блоки, bitte. – 2010-12-05 11:38:54

ответ

5

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

@property (nonatomic, retain) NSMutableArray *bestellListe; 

Так что, когда вы делаете:

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

Ваш bestellListe имеет сохранить кол 2 (Alloc + Сохранять от собственности) ,

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

[bestellListe release]; 

Чем проще решение, кажется, сохранить его только один раз при его создании, с autoreleased инициализатором как:

self.bestellListe = [NSMutableArray arrayWithContentsOfFile:filePath]; 

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

+0

Большое спасибо, что решила проблему. – user3449120 2011-02-17 18:58:28