title: Undefined symbols for architecture error
body: <p>I am using Core Data to show data in a table view, but I constantly encounter this problem :</p>
  
  <blockquote>
    <p>Undefined symbols for architecture i386:<br>
    "_OBJC_CLASS_$_NSEntityDescription", referenced from:
          objc-class-ref in singleAppDelegate.o
          objc-class-ref in singleViewController.o   "_OBJC_CLASS_$_NSFetchRequest", referenced from:
          objc-class-ref in singleViewController.o   "_OBJC_CLASS_$_NSFetchedResultsController", referenced from:
          objc-class-ref in singleViewController.o   "_OBJC_METACLASS_$_NSManagedObject", referenced from:
          _OBJC_METACLASS_$_Data in Data.o   "_OBJC_CLASS_$_NSManagedObject", referenced from:
          _OBJC_CLASS_$_Data in Data.o</p>
  </blockquote>
  
  <p>here is my singleViewController.m</p>
  
  <pre><code>#import "Data.h"
  #import "singleViewController.h"
  
  @interface singleViewController ()
  
  @end
  
  @implementation singleViewController
  
  @synthesize managedObjectContext;
  @synthesize fetchedResultsController = _fetchedResultsController;
  
  - (id)initWithStyle:(UITableViewStyle)style
  {
      self = [super initWithStyle:style];
      if (self) {
          // Custom initialization
      }
      return self;
  }
  
  - (void)viewDidLoad
  {
      [super viewDidLoad];
  
      NSError *error;
      if (![[self fetchedResultsController] performFetch:&amp;error]) {
          // Update to handle the error appropriately.
          NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
          exit(-1);  // Fail
      }
  
      self.title = @"Core Data";
  }
  
  - (void)viewDidUnload
  {
      [super viewDidUnload];
  
      self.fetchedResultsController = nil;
  }
  
  - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
  {
      return (interfaceOrientation == UIInterfaceOrientationPortrait);
  }
  
  #pragma mark - Table view data source
  
  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
      // Return the number of sections.
      return 1;
  }
  
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  {
      // Return the number of rows in the section.
      id  sectionInfo =
      [[_fetchedResultsController sections] objectAtIndex:section];
      return [sectionInfo numberOfObjects];
  }
  
  - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
      Data *info = [_fetchedResultsController objectAtIndexPath:indexPath];
      cell.textLabel.text = info.title;
      cell.detailTextLabel.text = info.content;
  }
  
  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  {
      static NSString *CellIdentifier = @"Cell";
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  
      if (!cell) {
          cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
      }
  
      // Configure the cell...
      [self configureCell:cell atIndexPath:indexPath];
  
      return cell;
  }
  
  #pragma mark - fetchedResultsController
  
  - (NSFetchedResultsController *)fetchedResultsController {
  
      if (_fetchedResultsController != nil) {
          return _fetchedResultsController;
      }
  
      NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
      NSEntityDescription *entity = [NSEntityDescription
                                     entityForName:@"Data" inManagedObjectContext:managedObjectContext];
      [fetchRequest setEntity:entity];
  
      [fetchRequest setFetchBatchSize:20];
  
      NSFetchedResultsController *theFetchedResultsController =
      [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                          managedObjectContext:managedObjectContext sectionNameKeyPath:nil
                                                     cacheName:@"Root"];
      self.fetchedResultsController = theFetchedResultsController;
      _fetchedResultsController.delegate = self;
  
      return _fetchedResultsController;
  
  }
  
  - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
      // The fetch controller is about to start sending change notifications, so prepare the table view for updates.
      [self.tableView beginUpdates];
  }
  
  
  - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
  
      UITableView *tableView = self.tableView;
  
      switch(type) {
  
          case NSFetchedResultsChangeInsert:
              [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
              break;
  
          case NSFetchedResultsChangeDelete:
              [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
              break;
  
          case NSFetchedResultsChangeUpdate:
              [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
              break;
  
          case NSFetchedResultsChangeMove:
              [tableView deleteRowsAtIndexPaths:[NSArray
                                                 arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
              [tableView insertRowsAtIndexPaths:[NSArray
                                                 arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
              break;
      }
  }
  
  
  - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
  
      switch(type) {
  
          case NSFetchedResultsChangeInsert:
              [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
              break;
  
          case NSFetchedResultsChangeDelete:
              [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
              break;
      }
  }
  
  
  - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
      // The fetch controller has sent all current change notifications, so tell the table view to process all updates.
      [self.tableView endUpdates];
  }
  
  @end
  </code></pre>
  
  <p>and here is my appdelegate.m</p>
  
  <pre><code>#import "Data.h"
  #import "singleAppDelegate.h"
  #import "singleAppDelegate.h"
  
  @implementation singleAppDelegate
  
  @synthesize window = _window;
  @synthesize managedObjectContext = __managedObjectContext;
  @synthesize managedObjectModel = __managedObjectModel;
  @synthesize persistentStoreCoordinator = __persistentStoreCoordinator;
  
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
      NSManagedObjectContext *context = [self managedObjectContext];
      Data *data = [NSEntityDescription
                                        insertNewObjectForEntityForName:@"Data"
                                        inManagedObjectContext:context];
      data.title = @"title";
      data.content = @"test content";
  
      NSError *error;
      if (![context save:&amp;error]) {
          NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
      }
      return YES;
  }
  </code></pre>
  
  <p>and here is my data.m</p>
  
  <pre><code>@implementation Data
  
  @dynamic title;
  @dynamic content;
  
  @end
  </code></pre>
  
  <p>Don't know what's wrong.</p>