#objective-c #cocoa-touch #sqlite
#objective-c #cocoa-touch #sqlite
Вопрос:
У меня действительно странная проблема. У меня есть метод, который работает отлично, но я пытаюсь преобразовать его, чтобы сделать данные более управляемыми базой данных по сравнению с существующим в настоящее время жестким кодом. Когда я добавляю вызов к своему методу базы данных для извлечения данных, я получаю EXC_BAD_ACCESS спустя долгое время ПОСЛЕ завершения работы с базой данных. Я сузил область поиска до содержимого базы данных, поскольку, если я вообще не выполняю вызов, сбой не произойдет.
Итак, вызов метода выглядит следующим образом (здесь, если я закомментирую, он не завершится сбоем):
NSString *thisRoomNumber = [self readLocationsFromDatabaseBetweenPoints:fX YPoint:fY];
и сам метод выглядит следующим образом:
#pragma mark -
#pragma mark SQL Operations
- (NSString *)readLocationsFromDatabaseBetweenPoints:(float)tapPointX YPoint:(float)tapPointY{
// Setup some globals
databaseName = @"db.sqlite";
// Get the path to the documents directory and append the databaseName
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
// Setup the database object
sqlite3 *database;
NSString *sqlStringBuilder = [NSString stringWithFormat:@"select * from floors where propertyid = ? and floorid = ? and %f between topleftxcoord and bottomrightxcoord and %f between topleftycoord and bottomrightycoord", tapPointX, tapPointY];
NSString *roomNumber = @"0";
// Open the database from the users filessytem
if(sqlite3_open([databasePath UTF8String], amp;database) == SQLITE_OK) {
// Setup the SQL Statement and compile it for faster access
const char *sqlStatement = [sqlStringBuilder UTF8String];
NSLog(@"%@", [NSString stringWithUTF8String:sqlStatement]);
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, sqlStatement, -1, amp;compiledStatement, NULL) == SQLITE_OK) {
sqlite3_bind_int(compiledStatement, 1, iPropertyId);
sqlite3_bind_int(compiledStatement, 2, iFloorId);
// Loop through the results and add them to the feeds array
while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
// Read the data from the result row
NSInteger aLocId = sqlite3_column_int(compiledStatement, 0);
NSInteger aTLX = sqlite3_column_int(compiledStatement, 1);
NSInteger aTLY = sqlite3_column_int(compiledStatement, 2);
NSInteger aBRX = sqlite3_column_int(compiledStatement, 3);
NSInteger aBRY = sqlite3_column_int(compiledStatement, 4);
NSString *aRoomIdent = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
roomNumber = aRoomIdent;
}
}else{
NSLog(@"%d", sqlite3_prepare_v2(database, sqlStatement, -1, amp;compiledStatement, NULL));
}
// Release the compiled statement from memory
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
[documentsDir release];
[documentPaths release];
//[roomNumber release];
[sqlStringBuilder release];
return roomNumber;
}
Сам вызов работает нормально. Я получаю результаты, как и ожидалось, «thisRoomNumber» возвращается с тем, что я ожидаю, что это будет. Как только вызывающий метод переходит к следующей части, он возвращается к делегату, и в этот момент происходит сбой. Я знаю, что трудно понять, что происходит, не имея большого количества используемого кода, но сам объем кода сделал бы этот пост МАССОВЫМ.
Надеюсь, это даст нам отправную точку для исправления этого. Кроме того, дамп журнала сбоев не дает абсолютно ничего полезного для этого.
Спасибо за любую помощь, которую вы, ребята, можете оказать! Если вам нужна дополнительная информация, дайте мне знать, я сделаю все возможное, чтобы добавить к этому по мере необходимости.
Комментарии:
1. Возможно, вы случайно уменьшаете количество ссылок на то, чего не должны: выдает ли ‘Build and Analyse’ какие-либо предупреждения?
2. Я вообще не получаю никаких реальных предупреждений (кроме нескольких вещей, о которых я знаю и которые ничего не сломают — некоторые неиспользуемые значения и т.д., Но они были там всегда, я просто не обошел их, чтобы закончить эту часть)
Ответ №1:
Проблема заключается в ваших вызовах release в конце. Вы освобождаете объекты, которые вам не принадлежат. Удалите их, и все должно быть в порядке.
Комментарии:
1. Не уверен, почему я это сделал, теперь, когда я оглядываюсь назад на это.