title: Objective-C Class Reference: Symbols not found error
body: <p>I've been working on this iPhone app for a while now, and I had it completely finished and working. The project I was expanding on was downloaded from a subversion repository online that my professor had given me access too. I accidentally didn't download the "root" copy or something like that, so I wasn't able to commit any changes to the repository. With my instructors help, I downloaded the root copy today and added all my class files to it so I could commit the changes. However, I am now getting 3 strange errors that I have never seen before:</p>
  
  <p>Undefined symbols:</p>
  
  <blockquote>
    <p>"_OBJC_CLASS_$_mapListViewController",
    referenced from:
          objc-class-ref-to-mapListViewController
    in mapViewController.o</p>
    
    <p>"_OBJC_CLASS_$_mapParser",
    referenced from:
          objc-class-ref-to-mapParser in mapViewController.o</p>
    
    <p>"_OBJC_CLASS_$_mapTabViewController",
    referenced from:
          objc-class-ref-to-mapTabViewController
    in mapViewController.o</p>
    
    <p>ld: symbol(s) not found collect2: ld
    returned 1 exit status</p>
  </blockquote>
  
  <p>That is the exact error message I am getting. I have not changed any code from the version that was working completely earlier this morning. Any advice? The mapViewController file seems to be what is causing the issue, so here is that as well:</p>
  
  <pre><code>#import "mapViewController.h"
  #import "locationDetailViewController.h"
  #import "DPUAnnotation.h"
  #import "mapParser.h"
  #import "mapListViewController.h"
  #import "mapTabViewController.h"
  
  @implementation mapViewController
  @synthesize locationManager, mapView, mapAnnotations, mParser, mapListView, tabView;
  
  @class DPUAnnotation;
  
  + (CGFloat)annotationPadding;
  {
      return 10.0f;
  }
  + (CGFloat)calloutHeight;
  {
      return 40.0f;
  }
  
  - (void)gotoLocation
  {
      // start off by default at DePauw campus
      MKCoordinateRegion newRegion;
      newRegion.center.latitude = 39.639348;
      newRegion.center.longitude = -86.861231;
      newRegion.span.latitudeDelta = 0.006776;
      newRegion.span.longitudeDelta = 0.006291;
  
      [self.mapView setRegion:newRegion animated:YES];
  }
  
  - (void)viewDidLoad {
  
      self.title = @"Map";
      mapView.mapType = MKMapTypeHybrid;
      mapView.showsUserLocation = YES;
  
      mapListView = [[mapListViewController alloc] initWithNibName:@"mapListView" bundle:nil];
      tabView = [[mapTabViewController alloc] initWithNibName:@"mapTabViewController" bundle:nil];
  
      if (mapAnnotations == nil)
      {
          self.mapAnnotations = [NSMutableArray array];
      } 
      else 
      {
          [mapAnnotations removeAllObjects];
      }
  
      UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"btn_home.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(mainpageClicked)];
      [self.navigationItem setLeftBarButtonItem:backButton];
  
      UIBarButtonItem *mapListButton = [[UIBarButtonItem alloc] initWithTitle:@"Building List" style:UIBarButtonItemStylePlain target:self action:@selector(pushMapList)];
      [self.navigationItem setRightBarButtonItem: mapListButton];
  
      locationManager = [[CLLocationManager alloc] init];
      locationManager.delegate = self;
      locationManager.desiredAccuracy = kCLLocationAccuracyBest;
      [locationManager startUpdatingLocation];
  
      [self gotoLocation];
  
      self.mParser = [[[mapParser alloc] init] autorelease];
      self.mParser.delegate = self;
      [self.mParser start];
  
      [super viewDidLoad];
  }
  
  - (void)viewDidAppear:(BOOL)animated
  {
      [super viewDidAppear:(BOOL)animated];
  }
  
  - (void)dealloc 
  {
      [mapView release];
      [locationManager release];
      [mapAnnotations release];
  
      [super dealloc];
  }
  
  /*
   * Returns the User to the main Application Page
   */
  - (IBAction)mainpageClicked
  {
      NSLog(@"Return To Main page Clicked");
      [self.parentViewController dismissModalViewControllerAnimated:YES];
      [self.navigationController release];
  }
  
  - (IBAction) pushMapList
  {   
      tabView = [[mapTabViewController alloc] initWithNibName:@"mapTabViewController" bundle:nil];
      tabView.mapAnnotations2 = mapAnnotations;
      [self.navigationController pushViewController:tabView animated:YES];
      [tabView release];
  }
  
  - (IBAction)addAnnotation
  {   
      [self.mapView removeAnnotations:self.mapView.annotations];
  
      for (int i = 0; i &lt; [mapAnnotations count]; i++)
          [mapView addAnnotation:[mapAnnotations objectAtIndex:i]];
      NSLog(@"BLAH BLAH BLAH PLEASE PRINT");
      if([mapAnnotations count] == 0)
          NSLog(@"array is empty");
  }
  
  - (void)showDetails:(id)sender
  {
      NSInteger selectedIndex = [sender tag];
      DPUAnnotation *selectedObject = [mapAnnotations objectAtIndex:selectedIndex];
  
      [self.navigationController setToolbarHidden:YES animated:NO];
  
      NSURL *url = [NSURL URLWithString: selectedObject.url];
  
      locationDetailViewController *locationDetailView;
      locationDetailView = [[locationDetailViewController alloc] initWithNibName:@"mapDetailView" bundle:nil];
      [self.navigationController pushViewController:locationDetailView animated:YES];
      [locationDetailView.webView loadRequest: [NSURLRequest requestWithURL:url]];
      [locationDetailView release];
  
      [selectedObject release];
  }
  
  - (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation
  {   
      // if it's the user location, just return nil.
      if ([annotation isKindOfClass:[MKUserLocation class]])
          return nil;
  
      if([[annotation subtitle] isEqualToString:@"Academic"])
      {
          // try to dequeue an existing pin view first
          static NSString* annotationIdentifier = @"annotationIdentifier";
          MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
  
          if (!pinView)
          {
              MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                               reuseIdentifier:annotationIdentifier] autorelease];
              annotationView.canShowCallout = YES;
  
              UIImage *academicImage = [UIImage imageNamed:@"academic.png"];
  
              CGRect resizeRect;
  
              resizeRect.size = academicImage.size;
              CGSize maxSize = CGRectInset(self.view.bounds,
                                           [mapViewController annotationPadding],
                                           [mapViewController annotationPadding]).size;
              maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
              if (resizeRect.size.width &gt; maxSize.width)
                  resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
              if (resizeRect.size.height &gt; maxSize.height)
                  resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
  
              resizeRect.origin = (CGPoint){0.0f, 0.0f};
              UIGraphicsBeginImageContext(resizeRect.size);
              [academicImage drawInRect:resizeRect];
              UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
  
              annotationView.image = resizedImage;
              annotationView.opaque = NO;
  
              UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
              NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
              rightButton.tag = annotationValue;
              [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
              annotationView.rightCalloutAccessoryView = rightButton;
  
              return annotationView;
          }
          else
          {
              pinView.annotation = annotation;
          }
          return pinView;
      }
  
      else if([[annotation subtitle] isEqualToString:@"Administrative"])
      {
          // try to dequeue an existing pin view first
          static NSString* annotationIdentifier = @"annotationIdentifier";
          MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
  
          if (!pinView)
          {
              MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                               reuseIdentifier:annotationIdentifier] autorelease];
              annotationView.canShowCallout = YES;
  
              UIImage *administrativeImage = [UIImage imageNamed:@"administrative.png"];
  
              CGRect resizeRect;
  
              resizeRect.size = administrativeImage.size;
              CGSize maxSize = CGRectInset(self.view.bounds,
                                           [mapViewController annotationPadding],
                                           [mapViewController annotationPadding]).size;
              maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
              if (resizeRect.size.width &gt; maxSize.width)
                  resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
              if (resizeRect.size.height &gt; maxSize.height)
                  resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
  
              resizeRect.origin = (CGPoint){0.0f, 0.0f};
              UIGraphicsBeginImageContext(resizeRect.size);
              [administrativeImage drawInRect:resizeRect];
              UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
  
              annotationView.image = resizedImage;
              annotationView.opaque = NO;
  
              UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
              NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
              rightButton.tag = annotationValue;
              [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
              annotationView.rightCalloutAccessoryView = rightButton;
  
              return annotationView;
          }
          else
          {
              pinView.annotation = annotation;
          }
          return pinView;
      }
  
      else if([[annotation subtitle] isEqualToString:@"University Housing"] || [[annotation subtitle] isEqualToString:@"Residence Halls"] || [[annotation subtitle] isEqualToString:@"University Duplexes"] || [[annotation subtitle] isEqualToString:@"Greek Housing"])
      {
          // try to dequeue an existing pin view first
          static NSString* annotationIdentifier = @"annotationIdentifier";
          MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
  
          if (!pinView)
          {
              MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                               reuseIdentifier:annotationIdentifier] autorelease];
              annotationView.canShowCallout = YES;
  
              UIImage *housingImage = [UIImage imageNamed:@"housing.png"];
  
              CGRect resizeRect;
  
              resizeRect.size = housingImage.size;
              CGSize maxSize = CGRectInset(self.view.bounds,
                                           [mapViewController annotationPadding],
                                           [mapViewController annotationPadding]).size;
              maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
              if (resizeRect.size.width &gt; maxSize.width)
                  resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
              if (resizeRect.size.height &gt; maxSize.height)
                  resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
  
              resizeRect.origin = (CGPoint){0.0f, 0.0f};
              UIGraphicsBeginImageContext(resizeRect.size);
              [housingImage drawInRect:resizeRect];
              UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
  
              annotationView.image = resizedImage;
              annotationView.opaque = NO;
  
              UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
              NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
              rightButton.tag = annotationValue;
              [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
              annotationView.rightCalloutAccessoryView = rightButton;
  
              return annotationView;
          }
          else
          {
              pinView.annotation = annotation;
          }
          return pinView;
      }
  
      else if([[annotation subtitle] isEqualToString:@"Other"])
      {
          // try to dequeue an existing pin view first
          static NSString* annotationIdentifier = @"annotationIdentifier";
          MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
  
          if (!pinView)
          {
              MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                               reuseIdentifier:annotationIdentifier] autorelease];
              annotationView.canShowCallout = YES;
  
              UIImage *otherImage = [UIImage imageNamed:@"other.png"];
  
              CGRect resizeRect;
  
              resizeRect.size = otherImage.size;
              CGSize maxSize = CGRectInset(self.view.bounds,
                                           [mapViewController annotationPadding],
                                           [mapViewController annotationPadding]).size;
              maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
              if (resizeRect.size.width &gt; maxSize.width)
                  resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
              if (resizeRect.size.height &gt; maxSize.height)
                  resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
  
              resizeRect.origin = (CGPoint){0.0f, 0.0f};
              UIGraphicsBeginImageContext(resizeRect.size);
              [otherImage drawInRect:resizeRect];
              UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
  
              annotationView.image = resizedImage;
              annotationView.opaque = NO;
  
              UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
              NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
              rightButton.tag = annotationValue;
              [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
              annotationView.rightCalloutAccessoryView = rightButton;
  
              return annotationView;
          }
          else
          {
              pinView.annotation = annotation;
          }
          return pinView;
      }
  
      else if([[annotation subtitle] isEqualToString:@"Fields"])
      {
          // try to dequeue an existing pin view first
          static NSString* annotationIdentifier = @"annotationIdentifier";
          MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
  
          if (!pinView)
          {
              MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                               reuseIdentifier:annotationIdentifier] autorelease];
              annotationView.canShowCallout = YES;
  
              UIImage *athleticsImage = [UIImage imageNamed:@"athletics.png"];
  
              CGRect resizeRect;
  
              resizeRect.size = athleticsImage.size;
              CGSize maxSize = CGRectInset(self.view.bounds,
                                           [mapViewController annotationPadding],
                                           [mapViewController annotationPadding]).size;
              maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
              if (resizeRect.size.width &gt; maxSize.width)
                  resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
              if (resizeRect.size.height &gt; maxSize.height)
                  resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
  
              resizeRect.origin = (CGPoint){0.0f, 0.0f};
              UIGraphicsBeginImageContext(resizeRect.size);
              [athleticsImage drawInRect:resizeRect];
              UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
  
              annotationView.image = resizedImage;
              annotationView.opaque = NO;
  
              UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
              NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
              rightButton.tag = annotationValue;
              [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
              annotationView.rightCalloutAccessoryView = rightButton;
  
              return annotationView;
          }
          else
          {
              pinView.annotation = annotation;
          }
          return pinView;
      }
  
      else if([[annotation subtitle] isEqualToString:@"Landmarks"])
      {
          // try to dequeue an existing pin view first
          static NSString* annotationIdentifier = @"annotationIdentifier";
          MKPinAnnotationView* pinView = (MKPinAnnotationView *)[theMapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
  
          if (!pinView)
          {
              MKAnnotationView *annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation
                                                                               reuseIdentifier:annotationIdentifier] autorelease];
              annotationView.canShowCallout = YES;
  
              UIImage *landmarkImage = [UIImage imageNamed:@"landmark.png"];
  
              CGRect resizeRect;
  
              resizeRect.size = landmarkImage.size;
              CGSize maxSize = CGRectInset(self.view.bounds,
                                           [mapViewController annotationPadding],
                                           [mapViewController annotationPadding]).size;
              maxSize.height -= self.navigationController.navigationBar.frame.size.height + [mapViewController calloutHeight];
              if (resizeRect.size.width &gt; maxSize.width)
                  resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
              if (resizeRect.size.height &gt; maxSize.height)
                  resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);
  
              resizeRect.origin = (CGPoint){0.0f, 0.0f};
              UIGraphicsBeginImageContext(resizeRect.size);
              [landmarkImage drawInRect:resizeRect];
              UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
  
              annotationView.image = resizedImage;
              annotationView.opaque = NO;
  
              UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
              NSInteger annotationValue = [self.mapAnnotations indexOfObject:annotation];
              rightButton.tag = annotationValue;
              [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
              annotationView.rightCalloutAccessoryView = rightButton;
  
              return annotationView;
          }
          else
          {
              pinView.annotation = annotation;
          }
          return pinView;
      }
  
      return nil;
  }
  
  #pragma mark &lt;mapParser&gt; Implementation
  
  - (void)parser:(NSXMLParser *)parser didFailWithError:(NSError *)parseError {
  
  }
  
  - (void)parserDidEndParsingData:(mapParser *)parser
  {
      [self addAnnotation];
  
      tabView.mapAnnotations2 = mapAnnotations;
  
      self.mParser = nil;
      [mParser release];
  }
  
  - (void)parser:(mapParser *)parser didParseItem:(NSArray *)parsedItem
  {
      NSLog(@"Did Parse Map Item");
  
      [self.mapAnnotations addObjectsFromArray:parsedItem];
  }
  
  - (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {}
  - (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {}
  
  @end
  </code></pre>