Еще одна утечка NSMutableDictionary Post - PullRequest
1 голос
/ 15 сентября 2010

Я часами стучал головой по монитору (и читал похожие посты).Я все еще в замешательстве.

Я объявляю массив в моем * .h файле, который будет отображать данные в виде таблицы:

@interface TeamsTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource> 
{
    NSMutableArray *teamsArray;
}

Я выделяю массив в -viewDidLoad и освобождаюэто в dealloc:

-(void)viewDidLoad 
{
    [super viewDidLoad];

    // Inititalize the mutablearray that will store the xml for the table.
    teamsArray = [[NSMutableArray alloc] init];
}

-(void)dealloc 
{
    [teamsArray release];

    [super dealloc];
}

Каждый раз, когда -viewWillAppear, я вызываю свой loadData для перезагрузки данных (потому что данные могут измениться).Для этого поста (и когда я пытаюсь определить свою утечку), я жестко закодировал данные.Комментарий показывает местоположение сообщенных утечек.(Утечка возникает при повторном отображении табличного представления.)

-(void)loadData
{
    // Empty any objects that are already in the array.
    [teamsArray removeAllObjects];

    // Fill a dictionary (normally looping through a file, but hardcoded for leak hunting).
    NSMutableDictionary *oneTeamDictionary = [NSMutableDictionary dictionary];

    [oneTeamDictionary setObject:@"100"         forKey:@"basenumber"];
    [oneTeamDictionary setObject:@"Team Name"   forKey:@"teamname"];
    [oneTeamDictionary setObject:@"XYZ"         forKey:@"teamabbr"];
    [oneTeamDictionary setObject:@"USA"         forKey:@"countryabbr"];
    [oneTeamDictionary setObject:@"Joe"         forKey:@"manager"];

    // Add this team to the array used to display table data.
    [teamsArray addObject:[oneTeamDictionary copy]];  // Leaks Malloc 32 bytes and _NSCFDictionary 48 bytes here.

    // Reload the table view with new data.
    [self.tableView reloadData];
}

В моем состоянии новичка я бы подумал, что [teamsArray release] освободит объект словаря.Я также попытался использовать «alloc] init]» для создания словаря, а также освободить и перераспределить groupsArray (вместо вызова removeAllObjects).

Ответы [ 2 ]

2 голосов
/ 15 октября 2010

Проблема в функции копирования. Примечание из документов:

Особые замечания

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

Почему ты просто не звонишь:

[teamsArray addObject:oneTeamDictionary];
0 голосов
/ 10 февраля 2011

Да, Иона, ты прав. Если вы делаете копию этого объекта, то вам нужно снова отпустить объект. На retain, alloc, mutableCopy, Copy и т. Д ... мы должны объект. Поэтому мы должны выпустить их.

...