Утечка памяти в Objective C Class iOS - PullRequest
0 голосов
/ 10 сентября 2010

Я искал все выше и ниже, чтобы попытаться устранить эту утечку памяти, но я не могу понять, как ее устранить.У меня есть несколько классов, которые я использую для подключения к своей базе данных sqlite и получения информации.

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

Ниже приведен код, который у меня есть.Любая помощь в устранении этой утечки будет принята с благодарностью.

tbl_materialsList.h

@interface tbl_materialsList : NSObject {

 NSInteger materialListID;
 NSString *shoppingListID;
 NSString *projectID;
 NSString *materialName;
 NSString *numberOfUnits;
 NSString *purchased;
 NSString *totalPrice;
 NSString *unitPrice;

}

@property (nonatomic, readonly) NSInteger materialListID;
@property (nonatomic, retain) NSString *shoppingListID;
@property (nonatomic, retain) NSString *projectID;
@property (nonatomic, retain) NSString *materialName;
@property (nonatomic, retain) NSString *numberOfUnits;
@property (nonatomic, retain) NSString *purchased;
@property (nonatomic, retain) NSString *totalPrice;
@property (nonatomic, retain) NSString *unitPrice;

- (id)getDataToDisplay:(NSString *)dbPath :(NSString *)selectStatement;
- (void)saveData:(NSString *)dbPath :(NSString *)selectStatement;
- (id)initWithPrimaryKey:(NSInteger)pk;

tbl_materialsList.m

- (id)getDataToDisplay:(NSString *)dbPath :(NSString *)selectStatement {


 // Init the data Array
 NSMutableArray *data = [[NSMutableArray alloc] init];

 if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

  NSString *sql = selectStatement; //"select * from tbl_projects";
  sqlite3_stmt *selectstmt;
  if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &selectstmt, NULL) == SQLITE_OK) {
   //loop thru and fill the array
   while(sqlite3_step(selectstmt) == SQLITE_ROW) {
    //reading the results
    NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
    tbl_materialsList *listObj = [[tbl_materialsList alloc] initWithPrimaryKey:primaryKey];
    listObj.shoppingListID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
    listObj.projectID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
    listObj.materialName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];
    listObj.numberOfUnits = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)];
    listObj.purchased = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 5)];
    listObj.totalPrice = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];
    listObj.unitPrice = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 7)];

    [data addObject:listObj];
    [listObj release];
   }
  }

  //release the compiled statment from memory
  sqlite3_finalize(selectstmt);

 }

 sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.

 return data;

}

Ответы [ 4 ]

3 голосов
/ 10 сентября 2010

Ваша последняя строка:

return data;

должно быть:

return [data autorelease];

Если, конечно, вы не предполагаете, что возвращаемый объект данных будет принадлежать вызывающей стороне, то вы должны привести имя метода в соответствие с соглашениями об именах Objective C в этом методе, которые возвращают объекты с сохраняемым счетчиком +1, если содержать одно из слов «копировать», «создать» или «новый»;

Но я подозреваю, что это не то, что вы намереваетесь.

1 голос
/ 10 сентября 2010

Реализует ли ваш tbl_materialslist dealloc, который устанавливает все ваши сохраняемые свойства равными nil?Если нет, то все они просочились, хотя ваш listObj был выпущен.

0 голосов
/ 10 сентября 2010

Несвязанный совет:

Никогда не возвращайте объект как (id) , если это не является абсолютно необходимым . Например, ваш getDataToDisplay:: должен быть

-(NSMutableArray*)getDataToDisplay:(NSString *)dbPath :(NSString *)selectStatement;

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

Полагаю, есть книга по программированию для iPhone, которая продвигает этот дурной обычай. Автор книги должен быть привязан, а книга должна быть сожжена ...: p

0 голосов
/ 10 сентября 2010
Строка

должна быть в первую очередь @property(nonatomic,copy), и вам необходимо освободить данные.[data release];

...