ситуация утечки памяти в iphone - PullRequest
0 голосов
/ 20 ноября 2010

У меня возникает утечка памяти, когда я вызываю метод, который возвращает мне строку ---- определение метода выглядит следующим образом

-(NSMutableArray *)read
{
NSMutableArray  *dataArray = [[NSMutableArray alloc] init];

//picking data from database here


return dataArray;
}

это показывает большую утечку памяти, которую я также пытался --- NSMutableArray *dataArray = [[[NSMutableArray alloc] init]autorelease];

но на этот раз процесс проверки на слабость зависает

я также не могу освободить этот массив до возврата

, пожалуйста, помогите

Ответы [ 3 ]

3 голосов
/ 20 ноября 2010
-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [[NSMutableArray alloc] init];

    //picking data from database here

    return dataArray;
}

Все, что использует метод read, будет ожидать возврата объекта, которому он не принадлежит. Однако, как написано здесь, dataArray по-прежнему принадлежит в момент возврата. Вы не можете выпустить это, потому что это могло бы заставить это вообще уйти. В этом случае вы должны автоматически освободить массив. Вы можете сделать это:

-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [[[NSMutableArray alloc] init] autorelease];

    //picking data from database here

    return dataArray;
}

или это

-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [[NSMutableArray alloc] init];

    //picking data from database here

    return [dataArray autorelease];
}

Вы говорите "процесс проверки на утечку зависает", но я действительно не уверен, что вы подразумеваете под этим. Вне зависимости от того, зависает ли это, вылетает или воспроизводится гимн Ботсваны, вам определенно нужно автоматически высвободить возвращенный массив, и любая другая проблема на самом деле является другой проблемой. Возможно, вы забыли сохранить данные в другом месте.

1 голос
/ 20 ноября 2010

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

Это НЕ ваш случай, следовательно, если вы делаете:

DatabaseReader *dbReader = [[DatabaseReader alloc] init];
NSMutableArray *mutArray = [dbReader read];
[dbReader release];

, вы НЕ должны выпускать mutArray.НО, созданный объект ДОЛЖЕН быть кем-то освобожден.Таким образом, вы можете сделать, как написал JeremyP.alloc / init и поместите его в пул авто-релиза внутри реализации метода чтения.Или вы можете сделать:

-(NSMutableArray *)read
{
    NSMutableArray  *dataArray = [NSMutableArray array];
    //IMPORTANT:
    //Did you noticed that I am not using any method 
    //with init prefix for the creation of dataArray ? 
    //so I don't need to release by my self ;)

    //picking data from database here

    return dataArray;
}

Что в основном то же самое.;)

0 голосов
/ 20 ноября 2010

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

NSLog(@"Retain count: %i", [dataArray retainCount]);

Включите консоль отладки (Command + R в Xcode), чтобы увидеть вывод NSLog.

...