Я все еще относительно новичок в разработке для iPhone, но мне показалось, что я понял основные принципы управления памятью.У меня есть метод класса, который возвращает NSMutableArray, я вызываю alloc и init для объекта, поэтому знаю, что отвечаю за его освобождение.Однако, поскольку я возвращаю массив, я предположил, что должен был использовать авто-релиз при создании объекта вместо того, чтобы освобождать его.
+(NSMutableArray *)getStations:(int)stationType {
if(database == nil){
[self openDataBase];
}
// Create a temporary array to hold the returned objects
NSMutableArray *holder = [[[NSMutableArray alloc] init] autorelease];
// Check if the statement has been defined
if(select4 == nil) {
const char *sql = "SELECT station_id, station_name, AVG(test_percent) FROM stations LEFT JOIN tests USING (station_id) WHERE station_type = ? GROUP BY station_id ORDER BY station_name ASC";
if(sqlite3_prepare_v2(database, sql, -1, &select4, NULL) != SQLITE_OK){
NSLog(@"Error while creating detail view statement. '%s'", sqlite3_errmsg(database));
}
}
sqlite3_bind_int(select4, 1, stationType);
// Check if the statement executed correctly
while(sqlite3_step(select4) == SQLITE_ROW) {
NSInteger primaryKey = sqlite3_column_int(select4, 0);
Tests *station = [[Tests alloc] initWithPrimaryKey:primaryKey];
station.station_name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(select4, 1)];
station.average_score = [NSNumber numberWithDouble:sqlite3_column_double(select4, 2)];
[holder addObject:station];
[station release];
}
// Reset the detail statement.
sqlite3_reset(select4);
// Return the holder array
return holder;
}
Есть основной код - XCode больше не указывает на потенциальную утечку памяти, но вылетаеткаждый раз, когда код выполняет произнесенное сообщение, отправленное на освобожденный экземпляр.Буду признателен за любую помощь, я потратил целую вечность, гуглял и не вижу, что не так с кодом.Я нашел эту ветку, но она не является ответом на мой вопрос - происходит сбой при возврате NSMutableArray?