#ios #sqlite #uitableview #exc-bad-access #sigabrt
#iOS #sqlite #uitableview #исключение -плохой доступ #sigabrt
Вопрос:
Я пытаюсь заполнить TableView информацией, извлеченной из базы данных SQLite… Я прочитал несколько руководств и попытался следовать им, но по какой-то причине мое приложение продолжает сбоить…
.h
//
// InOrder.h
// AGKUnsten
//
// Created by Jonas Christensen on 7/12/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface InOrder : UIViewController <UITableViewDelegate, UITableViewDataSource> {
NSArray *artworkInfo;
int rowsInDatabase;
}
.m
@property (nonatomic, retain) NSArray *artworkInfo;
@end
//
// InOrder.m
// AGKUnsten
//
// Created by Jonas Christensen on 7/12/11.
// Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "InOrder.h"
#import "ArtworkView.h"
#import "PaintingInfo.h"
#import "PaintingDatabase.h"
@implementation InOrder
@synthesize artworkInfo;
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return rowsInDatabase;
//return [artworkInfo count]; //Tried to use this, but app just crashes when it reaches this line
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSLog(@"test");//To see how far I get in the code - this is outputted
//Configure the cell
//APP CRASHES IF I TRY TO DO SOMETHING WITH MY DATABASE IN HERE
//cell.textLabel.text = [artworkInfo objectAtIndex:indexPath.row];//Tried this
//PaintingInfo *info = [artworkInfo objectAtIndex:indexPath.row];//Tried this
//cell.textLabel.text = info.artist;
//[[cell textLabel] setText:[artworkInfo objectAtIndex:[indexPath row]]];//Thread 1: Program received signal: "SIGABRT"
NSLog(@"test2");//Never reach here if I uncomment any of the above
return cell;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.title = @"Værker";
artworkInfo = [[PaintingDatabase database] findAllArtists];
rowsInDatabase = [artworkInfo count];
NSLog(@"%d", rowsInDatabase);
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
Буду признателен за любую помощь…
Я знаю, что моя база данных работает, поскольку я могу получать данные из нее в другом месте, но кажется, что когда я пытаюсь использовать ее здесь, приложение просто вылетает…
В основном это EXC_BAD_ACCESS и SIGABRT, которые отображаются как ошибка…
Теперь мне сказали, что SIGABORT = «SIGABRT — это сигнал, отправляемый, когда программа пытается прервать себя. Обычно это происходит потому, что произошло что-то действительно плохое «.
и «EXC_BAD_ACCESS происходит, когда сообщение отправляется объекту, который уже выпущен. К моменту обнаружения ошибки стек вызовов обычно отсутствует, особенно если речь идет о нескольких потоках. «
Ну, отлично .. но я не знаю, как это исправить… Любая помощь??
Ответ №1:
Вы назначаете непосредственно artworkInfo
(in viewDidLoad
) вместо использования средства доступа к свойствам, которое гарантировало бы правильное сохранение массива. Ваш массив, вероятно, (автоматически) освобождается к моменту вызова методов источника данных табличного представления.
Это должно быть:
self.artworkInfo = [[PaintingDatabase database] findAllArtists];
Ответ №2:
Если NSLog(@"%d", rowsInDatabase);
показывает вам ожидаемые результаты, то я подозреваю, что artworkInfo не сохраняется. Предполагая, что вы объявили это таким образом в своем файле .h (если это NSArray, а не NSMutableArray или что-то еще):
@property (nonatomic, retain) NSArray *artworkInfo;
Тогда проблема, вероятно, в том, что эта строка:
artworkInfo = [[PaintingDatabase database] findAllArtists];
Вместо этого попробуйте изменить его на:
self.artworkInfo = [[PaintingDatabase database] findAllArtists];
Разница в том, что первая строка присваивает значение переменной напрямую, в то время как вторая фактически запускает ее через метод с именем setArtworkInfo:, который, хотя вы его не видите, автоматически создается при использовании @synthesize
. Поскольку retain
в нем есть объявление свойства, этот метод также вызовет retain
метод для объекта, чтобы он оставался в памяти после завершения метода. Кроме того, вы можете сделать то же самое напрямую, как это
artworkInfo = [[[PaintingDatabase database] findAllArtists] retain];
И обязательно добавьте [artworkInfo release]
свой метод dealloc, потому что вы всегда должны вызывать release для любых объектов, которые вы сохраняете, когда закончите с ними.