Утечка памяти при второй загрузке вида - PullRequest
0 голосов
/ 23 июня 2010

Я ломал голову над этой утечкой памяти ..

мой источник данных является изменяемым. Это загружается в viewdidload. если я не сохраню это. у меня нет доступа к нему в cellforrowatindexpath. но когда я сохраняю это .. это обнаруживается как утечка памяти в инструментах. я пробовал так много разных вариантов .. кажется, не понял это правильно.

вот код утечки в "dict" и "plistPath"

` - (void) viewDidLoad { [super viewDidLoad];

self.navigationController.navigationBarHidden = NO;

self.title = @"Messages & Lists";


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

[plistPath release];
plistPath = [documentsDirectory stringByAppendingPathComponent:@"general.plist"];

NSFileManager *fileManager = [NSFileManager defaultManager];
[dict release];

if ( [fileManager fileExistsAtPath:plistPath] ) {

    dict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath] ;


} else {
    dict = [NSMutableDictionary dictionaryWithCapacity:1];

    [dict setObject:@"NO" forKey:@"busyStatus"];
    [dict setObject:@"NO" forKey:@"replyToAll"];
    [dict setObject:@"NO" forKey:@"replyToList"];
    [dict setObject:@"NO" forKey:@"dontReplyToList"];

    [dict writeToFile:plistPath atomically:YES];


}

[tableData release];

tableData = [[NSMutableDictionary alloc] init];

[tableData setObject:[NSArray arrayWithObjects:@"Help",@"Set Default Message",@"Reply To All",[dict objectForKey:@"replyToAll"],nil] forKey:@"1"];
[tableData setObject:[NSArray arrayWithObjects:@"Reply to a List",[dict objectForKey:@"replyToList"],@"List of Contacts",nil] forKey:@"2"];
[tableData setObject:[NSArray arrayWithObjects:@"Don't reply to List",[dict objectForKey:@"dontReplyToList"],@"List of Contacts",nil] forKey:@"3"];


[dict retain];  
[plistPath retain];

}

`

нет утечки при первой загрузке вида. но если я вернусь. и затем снова загрузите вид, чтобы он просочился.

Заранее спасибо всем, кто может мне помочь.

Ответы [ 3 ]

2 голосов
/ 23 июня 2010

Вы должны вызвать [dict release] в методе dealloc вашего контроллера представления.

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

Кажется, правильно.Единственное, что меня смущает - это tableData.Этот var освобожден или выделен где-то еще?

Скажем, вы размещаете его где-то еще, а не освобождаете его в dealloc, разве это не должны быть шаги:

  1. tableDataвыделяется где-то еще.
  2. tableData высвобождается в viewDidLoad
  3. tableData снова распределяется (счетчик 1).
  4. Выход из представления, повторный вход в представление, снова выделение tableData, освобождение ивыделено в функции (счетчик два?)

Похоже на длинный снимок, но.Можете ли вы показать, что говорят инструменты?

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

Я думаю, вам следует освободить ваш словарь в методе dealloc вашего контроллера представления, чтобы при освобождении ViewController количество сохраняемых ресурсов вашего источника данных уменьшалось.

Сохранение без освобождения после использования является основным источником утечки памяти.

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