Утечка памяти в NSMutableArray - PullRequest
       3

Утечка памяти в NSMutableArray

1 голос
/ 22 декабря 2010
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
            NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
//Expenseentry* temp=[[[Expenseentry alloc]init]autorelease];
//Expenseentry* temp=[[Expenseentry alloc]init];
            temp=nil;
            temp=[[Expenseentry alloc]init];
                        //memory leak here
            temp.ID=[NSString stringWithFormat:@"%d",primaryKey];
                        //memory leak here 
            int i=1;    
 @try{
//Expenseentry* temp=[[Expenseentry alloc]init];
//tried this but no luck
 NSString   *s=[[NSString alloc]initWithFormat:@"%f",sqlite3_column_double(selectstmt, 1)];
                        temp.amount=s;
                        [s release];
                        [arrreturn addObject:temp];
                        //[temp release];
//if i uncomment this app crashes 
                        //[formatter release];
                        //printf("\n daata count %d ",[arrreturn count]);
                    }
                    @catch(id ex )
                    {
                        printf("ooooopssss exception ");
                    }
                    i++;
            }


мой класс ввода расходов


@interface Expenseentry : NSObject {
    NSString *ID; 
    NSString *amount;

}
@property (nonatomic, retain) NSString *ID;
@property (nonatomic, retain) NSString *amount;
@end
 and .m is just 
- (void)dealloc {
    [ID release];
[amount release]
}

Ответы [ 3 ]

2 голосов
/ 22 декабря 2010
  1. Похоже, что temp является переменной экземпляра для этого класса
  2. Убедитесь, что вы выполнили отпуск, когда закончите или перед тем, как использовать его снова

Попробуйте сделатьследующий

[temp release];
temp=[[Expenseentry alloc]init];
temp.ID=[NSString stringWithFormat:@"%d",primaryKey];

Другой вариант - освободить после того, как вы поработали с ним внутри цикла while (sqlite3_step)

while(sqlite3_step(selectstmt) == SQLITE_ROW) {
...
temp=[[Expenseentry alloc]init];
temp.ID=[NSString stringWithFormat:@"%d",primaryKey];
... //Use temp
[temp release];
temp = nil; //Best practice to set it to nil

Если строка temp.ID утечка, вам нужнозагляните в класс Expenseentry, чтобы убедиться, что вы делаете там правильное управление памятью.

Редактировать: теперь я вижу оставшуюся часть вашего кода, отправленную

[arrreturn addObject:temp];
//[temp release];
//if i uncomment this app crashes

Причина, по которой он, вероятно, дает сбой, заключается вЯ сказал прежде, что убедитесь, что вы установили его на ноль после освобождения

Редактировать 2: Вы повторно используете тот же объект внутри цикла while. Вы также захотите переместить временное распределение в цикл while или иначе каждый объект вэтот массив будет указывать на тот же объект.Я не уверен, что ваша цель с кодом, но взгляните на следующий код.

while(i>5)
{
   temp=[[Expenseentry alloc]init];
   temp.ID=[NSString stringWithFormat:@"%d",primaryKey];
   @try
   {
      NSString   *s=[[NSString alloc]initWithFormat:@"%f",sqlite3_column_double(selectstmt, 1)];
                        temp.amount=s;
                        [s release];
                        [arrreturn addObject:temp];
   }
   @catch(id ex )
   {
      printf("ooooopssss exception ");
   }
   [temp release];
   temp = nil;
   i++;
}
1 голос
/ 22 декабря 2010

temp = nil кажется немного странным. всякий раз, когда вы назначаете переменную temp новому объекту, не забудьте освободить предыдущий объект.

если вы напишите:

Expenseentry* temp=[[Expenseentry alloc]init];
temp=nil;

вы получаете утечку памяти, потому что вы создали объект Expenseentry, а затем в основном сказали, что нужно избавиться от него. Вам нужно сделать [временный релиз]; перед присвоением nil на iphone.

Могут быть и другие утечки, как в вашей статье Расходов, но вы не показываете, как это выглядит, т. Е. Как объявляется идентификатор свойства.

0 голосов
/ 24 декабря 2010

Хорошо, я обнаружил, что мою ошибку просто опубликовать, если кто-то может объяснить это поведение:
массив утечек памяти и массив-объект не были освобождены. Если бы я выпустил какой-либо из них, приложение вылетает.

ошибка 1: [super dealloc] отсутствует в раскладке расходника.
Сомнение: почему требуется выпуск супер? , когда Apple Doc говорит, что вы должны освободить свой объект.

ошибка 2: массив, возвращаемый этой функцией, сохраняется в переменной экземпляра (и синтезируется свойство с атрибутом retain в качестве) вызывающей стороны.
и я освободил это свойство в dealloc, поскольку оно сохраняется.

receivedArr=fun()

в Deloloc

[receivedArr release]
...