Странно EXC_BAD_ACCESS, что я делаю не так? - PullRequest
1 голос
/ 19 сентября 2010

У меня есть 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”.

Ответы [ 2 ]

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

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

Нашел, используя NSZombieEnabled, как предложил Марк. Спасибо!

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

Вы пытались использовать отладчик, чтобы увидеть, где находится ошибка?
В Xcode откройте отладчик, затем создайте приложение с точками останова. В симуляторе сделайте все шаги, чтобы воспроизвести ошибку.
Когда вы обнаружите ошибку, отладчик остановит приложение до его сбоя, и вы увидите, что вы реализовали методы в представлении отладчика ... Один или несколько из них будут выделены / написаны черным. В этих методах есть ошибка. Нажав на метод, вы увидите, где находится ошибка, а затем вы сможете изменить этот код, чтобы устранить ошибку ...

Надеюсь, это поможет вам! :)

...