Как убрать утечки памяти, вызванные другой библиотекой? - PullRequest
1 голос
/ 21 февраля 2012

В моем приложении я использую одну библиотеку, которая напрямую возвращает мне результат SQL-запросов в NSMutableArray. Когда я использую инструмент, тогда он показывает мне утечки памяти для массива, в котором хранится результат. Так что создатель библиотеки не обработанinit-release для массива правильно. Так есть ли способ справиться с утечками памяти, вызванными этим массивом вне библиотеки в моем коде?Код выглядит следующим образом:

-(void)getRecurringDataFromDatabase
{
     SafeRelease(_arrTblList);
    _arrTblList=[[NSMutableArray alloc]init] ;

    NSError *error = nil;
    NSString *strQuery = [NSString stringWithFormat:@"select * from wt_transaction as w  where w.subcat_id in (select s.subcat_id from subcategory as s where s.subcat_type = 'expense' and IsRepeat = 1)"];
    NSMutableArray *arrExpense = [NSMutableArray requestWithSynchronousQuery:strQuery withReturnningError:&error] ;

    NSString *strQuery1 = [NSString stringWithFormat:@"select * from wt_transaction as w  where w.subcat_id in (select s.subcat_id from subcategory as s where s.subcat_type = 'income' and IsRepeat = 1)"];
    NSMutableArray *arrIncome = [NSMutableArray requestWithSynchronousQuery:strQuery1 withReturnningError:&error];
    if (error) {
        [AppDelegate showAlert:[error description] withTitle:@"Error!"];
    }
    else{
        if ([arrExpense count]>0)
        {
            [_arrTblList addObject:arrExpense];
        }
        if ([arrIncome count]>0) 
        {

            [_arrTblList addObject:arrIncome];
        }
         _reloadCell = YES;
        [_tblView reloadData];
    }

Здесь он показывает утечки памяти для arrIncome и arrExpense.and освобождение или автоматическое освобождение этих массивов не устраняет утечки памяти. Единственный способ устранить эти утечки, если они могутбыть решенным создателем библиотеки? а также я получаю утечки памяти, если

(indexPath.row == 0) {
        OverviewViewController *obj1 = [[OverviewViewController alloc] initWithNibName:@"OverviewView" bundle:nil];
        [self.navigationController pushViewController:obj1 animated:YES];


        [obj1 release];
    } this code at line    [self.navigationController pushViewController:obj1 animated:YES];
     .how to resolve this leak?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Вы пытались выпустить их более одного раза? Как:

[array release];
[array release];

Обычно я бы не советовал, но если дело в том, что библиотека возвращает их, сохраняя их ненадлежащим образом, это может решить проблему. Попробуйте посмотреть свойство retainCount этих массивов, чтобы узнать, сколько раз они сохраняются. Просто помните, что это свойство полезно в основном для отладки и может давать странные результаты.

Вам нужно будет тщательно протестировать стабильность, если вы решите использовать этот подход.

1 голос
/ 22 февраля 2012

Какую бы библиотеку вы не использовали, похоже, она действительно плохо спроектирована. В частности, наложение категории на NSMutableArray (или NSArray) для выполнения доступа к базе данных является ужасным препятствием.

Кроме того, у вашего кода есть серьезные проблемы; get не следует использовать в качестве префикса, проверяя error напрямую, чтобы определить, произошла ли ошибка, и т. Д ...

Наконец, утечки говорят вам, где была выделена утечка , а не где произошла фактическая утечка. Если в библиотеке есть чрезмерная ошибка, вы должны это исправить (или заменить библиотеку) и не пытаться ее взломать.

...