我有一个回忆泄漏问题,也许有人可以帮助我。
我尝试为pList加载NSMutable数组,并在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.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


这会导致内存泄漏

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


有人可以帮我些什么,我真的很新。

最佳答案

您的属性综合方法会自动保留收到的对象:

@property (nonatomic, retain) NSMutableArray *bestellListe;


因此,当您这样做时:

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


您的bestellListe的保留数为2(分配+属性的保留数)。

在您的dealloc上,您只释放一次:

[bestellListe release];


更简单的解决方案似乎在创建它时只保留一次,并使用自动发布的初始化程序,例如:

self.bestellListe = [NSMutableArray arrayWithContentsOfFile:filePath];


希望这可以帮助

10-08 05:45