У меня есть UITabBarController.На одной из вкладок отображаются «закладки» приложения. Эти закладки являются типами поиска, сохраненными в базе данных Core Data (SQLLite).
Когда я загружаю свое приложение, перехожу в представление закладок (bookmarksViewController
), оно загружает функцию в моем appDelegate (getBookmarks
) и показывает результат в таблице.Это прекрасно работает, может переключаться между представлениями, поиск преформ в других представлениях переключаться обратно.Нет проблем.Он загружает контент каждый раз.НО ... когда я загружаю вид поиска и добавляю новую закладку, а затем переключаюсь обратно в вид закладок, он исчезает с сообщением об ошибке "EXC_BAD_ACCESS
".Я понятия не имею, почему и как я могу решить это.
Это мой код: bookmarksViewController.m
[...]
- (void)viewDidLoad {
[super viewDidLoad];
theBookmarks = nil;
// Set up the edit and add buttons.
self.navigationItem.rightBarButtonItem = self.editButtonItem;
[self setTitle:NSLocalizedString(@"Bookmarks", @"bookmarksViewController")];
}
- (void)viewWillAppear:(BOOL)animated {
if (theBookmarks != nil)
{
NSLog(@"Release it!");
[theBookmarks release];
}
NSLog(@"Appear 1");
stationenAppDelegate *stationen = (stationenAppDelegate *)[[UIApplication sharedApplication]delegate];
NSLog(@"Appear 1 - stage 2");
theBookmarks = [[stationen getBookmarks] retain];
NSLog(@"Appear 2");
[super viewWillAppear:animated];
}
[...]
myAppDelegate.m
[...]
/**
* Bookmarks
*
* Type definition
* 1: Station search
* 2: Train search
* 3: Interuption search
*/
- (NSMutableArray*)getBookmarks
{
NSLog(@"check 1");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"bookmarks"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSLog(@"check 2");
NSError *error;
NSArray *items = [[self.managedObjectContext
executeFetchRequest:fetchRequest error:&error] retain];
NSMutableArray *returnArray = [[[NSMutableArray alloc] initWithArray:items] retain];
NSLog(@"check 4");
[fetchRequest release];
return returnArray;
}
- (void)addBookmark:(bookmarks_object*)theBookmark
{
BOOL exists = [self checkIfBookmarkExistsUsingBookmark:theBookmark];
if(!exists)
{
bookmarks *saveBookmark = (bookmarks *)[NSEntityDescription insertNewObjectForEntityForName:@"bookmarks"
inManagedObjectContext:self.managedObjectContext];
[saveBookmark setStation_from:theBookmark.station_from];
[saveBookmark setStation_to:theBookmark.station_to];
[saveBookmark setAddDate:[[NSDate alloc] init]];
[saveBookmark setSort:theBookmark.sort];
[saveBookmark setPlace:[[NSNumber alloc] initWithInt:([[self getBookmarks] count]+1)]];
[saveBookmark setName:([theBookmark.type isEqualToString:@"1"] || [theBookmark.type isEqualToString:@"2"] ? theBookmark.station_from : [[NSString alloc] initWithFormat:@"%@ -> %@", theBookmark.station_from, theBookmark.station_to])];
[saveBookmark setType:theBookmark.type];
[self saveAction];
[saveBookmark release];
}
else {
NSLog(@"No need to add, %@ already exists!", theBookmark.station_from);
}
}
- (BOOL)checkIfBookmarkExistsUsingBookmark:(bookmarks_object*)theBookmark
{
// Get the categories
NSArray *historyArray = [self getBookmarks];
BOOL exists = NO;
for(bookmarks *dbHistory in historyArray)
{
if ([theBookmark.type isEqualToString:@"1"] || [theBookmark.type isEqualToString:@"2"])
{
if([[dbHistory station_from] isEqualToString:theBookmark.station_from])
{
exists = YES;
continue;
}
}
else if ([theBookmark.type isEqualToString:@"3"])
{
if([[dbHistory station_from] isEqualToString:theBookmark.station_from] &&
[[dbHistory station_to] isEqualToString:theBookmark.station_to])
{
exists = YES;
continue;
}
}
else {
NSLog(@"Error! Unknown type!");
return NO;
}
}
return exists;
}
[...]
Трассировка стека (поток: открытие приложения, просмотр закладок загрузки, переключение напоиск, добавить закладку, вернуться назад)
2010-09-19 13:51:54.554 stationen[7256:207] Appear 1
2010-09-19 13:51:54.555 stationen[7256:207] Appear 1 - stage 2
2010-09-19 13:51:54.555 stationen[7256:207] check 1
2010-09-19 13:51:54.560 stationen[7256:207] check 2
2010-09-19 13:51:54.562 stationen[7256:207] check 4
2010-09-19 13:51:54.562 stationen[7256:207] Appear 2
2010-09-19 13:52:26.669 stationen[7256:207] check 1
2010-09-19 13:52:26.670 stationen[7256:207] check 2
2010-09-19 13:52:26.671 stationen[7256:207] check 4
2010-09-19 13:52:26.671 stationen[7256:207] No need to add, 230 already exists!
2010-09-19 13:52:30.509 stationen[7256:207] Release it!
2010-09-19 13:52:30.510 stationen[7256:207] Appear 1
2010-09-19 13:52:30.510 stationen[7256:207] Appear 1 - stage 2
Program received signal: “EXC_BAD_ACCESS”.